绑定到 TreeView 的 HierarchicalDataTemplate 不产生任何东西

HierarchicalDataTemplate bound to a TreeView does not produce anything

我正在尝试使用数据绑定将层次结构绑定到 TreeView,但 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>

我正在使用的class:

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

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

我的操作有什么问题,为什么不起作用?

编辑:用于视图的 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
    }
  }

我已通过将 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>

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

问题是 TreeViewItemItemsSource 属性 需要一个集合,其中 HierarchyViewModel.Nodes 属性 的类型是 HierarchyNode。我建议将其更改为 ObservableCollection<HierarchyNode>。即:

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

您使用 ItemsSource="{Binding Nodes.ChildNodes}" 的解决方案部分有效,因为树视图不会显示根节点(在您的情况下为 Test1)。