【发布时间】:2013-07-17 19:03:19
【问题描述】:
我遇到了一个奇怪的问题。
我有一个非常基本的递归树结构:
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 根节点显示复选框。我尝试使用带有两个 HierarchicalDataTemplates 的 DataTemplateSelector,根据 TreeNode 的附加布尔属性选择模板,但这不起作用,因为 TreeNode 需要使用复选框显示一次,并且可能在没有复选框的情况下显示多次。
感谢任何帮助。
编辑:这里有一些虚拟数据来帮助解释我想要什么。 (还要注意数据中没有循环引用。)
+TreeNodeA
-TreeNodeB
-TreeNodeC
-TreeNodeB
+TreeNodeB
+TreeNodeC
-TreeNodeB
+TreeNodeD
-TreeNodeE
-TreeNodeC
-TreeNodeB
+TreeNodeE
-TreeNodeC
-TreeNodeB
在上面的视图中,只有以+ 开头的节点才应该有复选框。
【问题讨论】:
-
只是确认一下,你的意思是你可能有周期性引用吗?
-
我实际上已经确认没有使用 Tarjan 算法的循环引用。
-
我在
TreeView层次结构中对不同(但继承的)类型进行了类似的设置,如果你不介意你的根节点是一种特殊类型,我可以发布这种方法(尽管我认为下面提到的附加属性可能是更清洁的解决方案)。
标签: c# wpf hierarchicaldatatemplate datatemplateselector