Это относительно просто.
Определите три различных типа, к которым привязано дерево:
// defines root nodes in the tree
public sealed class RootNode : ITreeNode // or some other interface or base type
{
public IEnumerable<SubNode> SubNodes {get;set;}
}
// defines all middle nodes
public class SubNode : ITreeNode
{
public IEnumerable<SubNode> Children {get;set;}
}
// defines leafs
public sealed class LeafNode : SubNode { }
Создайте их и добавьте в ViewModel
public sealed class ViewModel
{
// or use an OC<T> or whatever your design needs
public IEnumerable<RootNode> Roots {get;set;}
Затем используйте HierarchicalDataTemplate.DataType , чтобы назначить шаблон для каждого:
<TreeView
ItemsSource="{Binding Roots}">
<TreeView.Resources>
<HierarchicalDataTemplate
xmlns:t="clr-namespace:NamespaceForNodeClasses"
DataType="{x:Type t:RootNode}
ItemsSource="{Binding SubNodes}">
<TextBlock Text="I'm a root node!"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate
xmlns:t="clr-namespace:NamespaceForNodeClasses"
DataType="{x:Type t:SubNode}
ItemsSource="{Binding Children}">
<TextBlock Text="I'm a regular tree node!"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate
xmlns:t="clr-namespace:NamespaceForNodeClasses"
DataType="{x:Type t:LeafNode}>
<TextBlock Text="I'm a leaf!"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>