C# 在WPF中,将不同的DataTemplate应用于树视图不同级别的同一项

C# 在WPF中,将不同的DataTemplate应用于树视图不同级别的同一项,c#,wpf,hierarchicaldatatemplate,datatemplateselector,C#,Wpf,Hierarchicaldatatemplate,Datatemplateselector,我这里有个奇怪的问题 我有一个非常基本的递归树结构: public class TreeNode { public string Name { get; set; } public IEnumerable<TreeNode> Children { get; set; } } 在上面的视图中,只有前面有+的节点应该有复选框。好吧,我不知道有什么简单的方法,但是您可以做的是创建一个附加属性并将其应用于每个TreeViewItem元素。有关在和中实现附加属性的详细信息,请

我这里有个奇怪的问题

我有一个非常基本的递归树结构:

public class TreeNode
{
    public string Name { get; set; }
    public IEnumerable<TreeNode> Children { get; set; }
}

在上面的视图中,只有前面有
+
的节点应该有复选框。

好吧,我不知道有什么简单的方法,但是您可以做的是创建一个附加属性并将其应用于每个TreeViewItem元素。有关在和中实现附加属性的详细信息,请参见

此附加属性将根据级别对TreeViewItem应用不同的样式

除非以编程方式生成
treevieItem
层次结构,否则获取该级别会有点棘手

如果不是,您可以在每次注册附加属性调用时通过遍历可视化树来计算它

或者,您可以尝试-理论上应该可以-通过将RelativeSource绑定到父级的附加属性,并使用IValueConverter将其递增1:

<TreeViewItem TreeViewLevelStyle.Level="{Binding RelativeSource=
         {RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}},
         Converter=IncrementByOneValueConverter}">


免责声明-这是一个想法,不是我以前尝试过的)

只是确认一下,你的意思是你可能有循环引用吗?我已经用Tarjan的算法确认了没有循环引用。我做了一些类似的事情,设计了不同的样式(但继承了)在
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);
    }
}
+TreeNodeA
  -TreeNodeB
  -TreeNodeC
    -TreeNodeB
+TreeNodeB
+TreeNodeC
  -TreeNodeB
+TreeNodeD
  -TreeNodeE
    -TreeNodeC
      -TreeNodeB
+TreeNodeE
  -TreeNodeC
    -TreeNodeB
<TreeViewItem TreeViewLevelStyle.Level="{Binding RelativeSource=
         {RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}},
         Converter=IncrementByOneValueConverter}">