2015-11-04 68 views
0

我想使用数据绑定将分层结构绑定到TreeView,但TreeView中不显示任何东西。在控制绑定到TreeView的HierarchicalDataTemplate不会产生任何东西

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 
    } 
    } 

我想要做的就是填充使用的childNodes在使用HierarchicalDataTemplate的HierarchyNode对象的TreeView ,同时为当前对象的名称显示一个TextBlock。根HierarchyNode是在ViewModel的构造函数中创建的。数据绑定在这个UserControl中起作用,因为将一个List <>绑定到ListBox工作正常。

我在做什么,为什么它不工作?

编辑:视图模型用于查看

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> 

但我相信,有处理这个问题的更好方法。

相关问题