绑定到TreeView的层次结构DataTemplate不会生成任何内容



我试图使用数据绑定将层次结构绑定到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>

我正在使用的类:

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

我想做的是使用HierarchyNode对象中的ChildNodes填充TreeView,同时显示当前对象名称的TextBlock。根层次结构节点是在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
    }
  }

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

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

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

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

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

相关内容

最新更新