绑定到TreeView的HierarchicalDataTemplate不会产生任何内容

时间:2015-11-04 09:07:12

标签: c# wpf xaml treeview

我正在尝试使用数据绑定将层次结构绑定到TreeView,但TreeView中没有显示任何内容。

控件中的XAML代码:

destroy

我正在使用的课程:

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

我想要做的是使用HierarchicalDataTemplate使用HierarchyNode对象中的ChildNodes填充TreeView,同时显示当前对象名称的TextBlock。根HierarchyNode是在ViewModel的构造函数中创建的。此UserControl中的数据绑定有效,因为绑定List&lt;&gt;到ListBox工作正常。

我在做什么有什么问题,为什么它不起作用?

编辑:用于视图的ViewModel

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

2 个答案:

答案 0 :(得分:1)

问题是ItemsSource的{​​{1}}属性需要一个集合,其中TreeViewItem属性的类型为HierarchyViewModel.Nodes。我建议将其更改为HierarchyNode。即:

ObservableCollection<HierarchyNode>

public ObservableCollection<HierarchyNode> Nodes { get; set; } 的解决方案部分起作用,因为树视图不会显示根节点(在您的情况下为 Test1 )。

答案 1 :(得分: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>

但我确信有更好的方法可以解决这个问题。