绑定到 System.Windows.Forms.TreeNode 集合的 WPF TreeView 不显示任何内容



我遇到了一点问题,我试图显示我的项目文件的分层树,当我绑定我的ObservableCollection时,我什么也没得到,也不知道为什么

这是我的视图模型:

public ObservableCollection<TreeNode> Root { get; set; }
private void LoadProject()
{
    var Root = new ObservableCollection<TreeNode>();
    var ParentsNodes = CreateDirectoryNody(new DirectoryInfo(cfg.ProjectPath));
    ParentsNodes.Text = "Source";
    ParentsNodes.Name = "Source";
    Root.Add(ParentsNodes);
}
private TreeNode CreateDirectoryNody(DirectoryInfo projectPath)
{
    var directioryNode = new TreeNode(projectPath.Name);
    foreach (var directory in projectPath.GetDirectories())
        directioryNode.Nodes.Add(CreateDirectoryNody(directory));
    foreach (var file in projectPath.GetFiles())
        directioryNode.Nodes.Add(new TreeNode(file.Name));
    return directioryNode;
}

这是我的 XAML:

<TreeView ItemsSource="{Binding Root}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type TreeViewItem}" ItemsSource="{Binding Root}">
            <StackPanel Orientation="Horizontal">
                <CheckBox/>
                <TextBlock Text="{Binding Text}"/>
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

我正在使用的TreeNode类是System.Windows.Forms.TreeNode

首先,不要将 Windows 窗体对象(如 TreeNode(与 WPF TreeView 混合使用。

您不必自己创建TreeNodeTreeViewItem而烦恼。WPF 使您可以轻松生成基于数据的接口。

我建议你创建自己的FileTreeNode类来代替TreeNode的使用:

public class FileTreeNode {
    public string Text { get; set; }
    public ObservableCollection<FileTreeNode> Children { get; set; }
}

改为将Root更改为FileTreeNode集合。

TreeView.ItemsSource绑定到 Root 集合时,将其绑定到FileTreeNode对象的集合。这些对象是您希望以分层方式表示的数据对象。

但是,当您编写 DataType="{x:Type TreeViewItem}" 时,您指示 WPF 如何绘制类型 TreeViewItem 的项,并且这些项不能是数据模板化的,因为它们已经UIElement。您要用HierarchicalDataTemplate定位的类型实际上是 FileTreeNode ,而不是内置TreeViewItem

此外,这些FileTreeNode中的每一个都应以分层方式表示,因此您应该在 HierarchicalDataTemplate.ItemsSource 属性中指定用于每个FileTreeNode的集合作为子集合,即Children,而不是Root

从那里开始,您现在应该拥有:

<HierarchicalDataTemplate DataType="{x:Type FileTreeNode}" ItemsSource="{Binding Children}">
    <StackPanel Orientation="Horizontal">
        <CheckBox/>
        <TextBlock Text="{Binding Text}"/>
    </StackPanel>
</HierarchicalDataTemplate>

最新更新