我有一个奇怪的问题。
我有一个非常基本的递归树结构:
public class TreeNode
{
public string Name { get; set; }
public IEnumerable<TreeNode> Children { get; set; }
}
并使用HierarchicalDataTemplate在TreeView中显示数据,如下所示:
<TreeView Name="_tree">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal" >
<CheckBox/>
<TextBlock Text="{Binding Path=Name}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
我从后面的代码填充树:
//allTreeNodes is a list of all existing Tree objects
public void PopulateTree(List<TreeNode> allTreeNodes)
{
foreach (var node in allTreeNodes)
{
_tree.Items.Add(node);
}
}
结果是一个TreeView,每个现有的Tree对象都作为根节点及其各自的子树。
请注意,每个TreeNode都可以在树中显示在多个位置,具体取决于它是否具有祖先。
到目前为止,一切运行良好,但我现在要做的只是为 visual 根节点显示复选框。 I&#39;已经使用DataTemplateSelector有两个HierarchicalDataTemplates,选择基于树节点的附加布尔属性模板尝试,但这个没有按&#39;吨的工作,因为树节点需要与复选框一次,可能多次显示,无复选框。
感谢任何帮助。
编辑:这是一些虚拟数据,以帮助解释我想要的。 (另请注意,数据中没有循环引用。)
+TreeNodeA
-TreeNodeB
-TreeNodeC
-TreeNodeB
+TreeNodeB
+TreeNodeC
-TreeNodeB
+TreeNodeD
-TreeNodeE
-TreeNodeC
-TreeNodeB
+TreeNodeE
-TreeNodeC
-TreeNodeB
在上面的视图中,只有前面带有+
的节点应该有复选框。
答案 0 :(得分:1)
好吧,我不知道任何简单的方法,但您可以做的是创建一个附加属性并将其应用于每个TreeViewItem元素。请参阅Overview和此example on StackOverflow中有关实施附加属性的详细信息。
此附加属性将根据级别对TreeViewItem应用不同的样式。
除非您以编程方式生成TreeViewItem
层次结构,否则获取级别会有点棘手。
如果没有,您可以在每次通过遍历可视树进行附加属性调用的注册时计算它。
或者您可以尝试 - 理论上应该工作 - 通过将RelativeSource绑定到父级的附加属性并使用IValueConverter将其递增1:
<TreeViewItem TreeViewLevelStyle.Level="{Binding RelativeSource=
{RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}},
Converter=IncrementByOneValueConverter}">
(免责声明 - 这是一个想法,而不是我之前尝试过的事情)