我遇到了一点问题,我试图显示我的项目文件的分层树,当我绑定我的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
混合使用。
您不必自己创建TreeNode
或TreeViewItem
而烦恼。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>