2015-11-04 4 views
0

Я пытаюсь связать иерархическую структуру с TreeView с помощью привязки данных, но ничего не отображается в TreeView.HierarchicalDataTemplate, связанный с TreeView, не производит ничего

XAML-код в контроле:

<UserControl x:Class="CQViewer.Views.HierarchyView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:h="clr-namespace:CQViewer.Hierarchy" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
    <TabControl Margin="5, 0, 5, 5" Grid.Column="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> 
     <TabItem Header="Repository"> 
     <TreeView Margin="5, 5, 5, 5" HorizontalAlignment="Stretch" ItemsSource="{Binding Path=Nodes}"> 
      <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type h:HierarchyNode}" 
             ItemsSource="{Binding ChildNodes}"> 
       <TextBlock Text="{Binding Name}" /> 
      </HierarchicalDataTemplate> 
      </TreeView.Resources> 
     </TreeView> 
     </TabItem> 
     <TabItem Header="Libraries"> 
     <ListBox Margin="5, 5, 5, 5" HorizontalAlignment="Stretch" /> 
     </TabItem> 
    </TabControl> 
    </Grid> 
</UserControl> 

Класс, который я использую:

using System.Collections.Generic; 

namespace CQViewer.Hierarchy 
    { 
    class HierarchyNode 
    { 
    #region Fields 
    private IList<HierarchyNode> childNodes_; 
    #endregion 

    #region Construction/Deconstruction/Initialisation 
    /// <summary> 
    /// Constructor 
    /// </summary> 
    public HierarchyNode (string Name) 
     { 
     this.Name = Name; 
     childNodes_ = new List<HierarchyNode>(); 
     } 
    #endregion 

    #region Properties 
    public string Name { get; set; } 
    public IList<HierarchyNode> ChildNodes 
     { 
     get { return childNodes_; } 
     set { childNodes_ = value; } 
     } 
    #endregion 
    } 
    } 

То, что я хочу сделать, это заполнить TreeView с помощью ChildNodes в объектах HierarchyNode с использованием HierarchicalDataTemplate , показывая TextBlock для имени текущего объекта. Корневой HierarchyNode создается в конструкторе ViewModel. Связывание данных в этом UserControl работает, поскольку привязка List <> к ListBox отлично работает.

Что не так с тем, что я делаю, и почему он не работает?

EDIT: ViewModel используется для представления

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using CQViewer.Hierarchy; 

namespace CQViewer.ViewModels 
    { 
    class HierarchyViewModel : ViewModelBase 
    { 
    #region Fields 

    #endregion 

    #region Construction/Deconstruction/Initialisation 
    /// <summary> 
    /// Constructor 
    /// </summary> 
    public HierarchyViewModel() 
     { 
     Nodes = new HierarchyNode ("Test1"); 
     HierarchyNode Node2 = new HierarchyNode ("TestX"); 
     Node2.ChildNodes.Add (new HierarchyNode ("TestY")); 

     Nodes.ChildNodes.Add (Node2); 
     Nodes.ChildNodes.Add (new HierarchyNode ("Test3")); 
     } 
    #endregion 

    #region Properties 
    public HierarchyNode Nodes { get; set; } 
    #endregion 

    #region Public Access Interface 
    /// <summary> 
    /// Creates/Recreates the hierarchy 
    /// </summary> 
    public void InitializeHierarchy() 
     { 
     // TODO Clear the tree view 
     } 

    /// <summary> 
    /// Gets the folder currently selected in the tree view hierarchy 
    /// </summary> 
    public string GetCurrentlySelected() 
     { 
     return "$/"; 
     } 
    #endregion 

    #region Private Functions 

    #endregion 
    } 
    } 
+0

Можете ли вы показать модель представления, которая используется элементом управления HierarchyView? –

+0

@ MichałKomorowski Сделано. Это в основном тестовый материал. – MKII

ответ

1

Проблема заключается в том, что ItemsSource свойство TreeViewItem ожидает коллекцию, где, как HierarchyViewModel.Nodes свойство имеет тип HierarchyNode. Я предлагаю изменить его на ObservableCollection<HierarchyNode>. т.е .:

public ObservableCollection<HierarchyNode> Nodes { get; set; } 

Ваше решение с ItemsSource="{Binding Nodes.ChildNodes}" работает частично, потому что вид дерева не будет отображаться корневой узел (Test1 в вашем случае).

+0

Вижу, спасибо. Сейчас он работает нормально. – MKII

0

мне удалось получить эту работу путем изменения кода TreeView на следующее:

<TreeView Margin="5, 5, 5, 5" HorizontalAlignment="Stretch"> 
     <TreeViewItem Header="{Binding Nodes.Name}" ItemsSource="{Binding Nodes.ChildNodes}"> 
     <TreeViewItem.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type h:HierarchyNode}" 
            ItemsSource="{Binding ChildNodes}"> 
      <TextBlock Text="{Binding Name}" /> 
      </HierarchicalDataTemplate> 
     </TreeViewItem.Resources> 
     </TreeViewItem> 
    </TreeView> 

Но я уверен, что есть лучший способ справиться с этим.