Вы можете использовать Interface
, чтобы получить эту работу.
xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var subNodes = new List<ITreeNode>
{
new SubNode { Name = "Sub Node 1" },
new SubNode { Name = "Sub Node 2" },
new SubNode { Name = "Sub Node 3" },
new SubNode { Name = "Sub Node 4" }
};
var nodes = new List<ITreeNode>
{
new Thread { Name = "Thread 1", ChildNodes = subNodes },
new Thread { Name = "Thread 2", ChildNodes = subNodes },
new Module { Name = "Module 1", ChildNodes = subNodes },
new Module { Name = "Module 2", ChildNodes = subNodes }
};
var processes = new List<Process>
{
new Process{ Name = "Process1", ChildNodes = nodes },
new Process{ Name = "Process2", ChildNodes = nodes }
};
TreeView.ItemsSource = processes;
}
}
public interface ITreeNode
{
string Name { get; set; }
List<ITreeNode> ChildNodes { get; set; }
}
public class Process : ITreeNode
{
public string Name { get; set; }
public int ID { get; set; }
public List<ITreeNode> ChildNodes { get; set; }
}
public class Module : ITreeNode
{
public string Name { get; set; }
public List<ITreeNode> ChildNodes { get; set; }
}
public class Thread : ITreeNode
{
public string Name { get; set; }
public int ID { get; set; }
public List<ITreeNode> ChildNodes { get; set; }
}
public class SubNode : ITreeNode
{
public string Name { get; set; }
public List<ITreeNode> ChildNodes { get => null; set => throw new System.NotImplementedException(); }
}
xaml
Если вам не нужен другой шаблон для уровня, вы можете использовать
<TreeView x:Name="TreeView">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding ChildNodes}">
<TextBlock Margin="3" Text="{Binding Name}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
Если вам нужен другой шаблон для уровней, вы можете использовать что-то вроде этого,
<TreeView x:Name="TreeView">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Process}" ItemsSource="{Binding ChildNodes}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name, StringFormat='{}{0} '}" />
<TextBlock Text="{Binding Path=ID, StringFormat=(ID: {0})}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Module}" ItemsSource="{Binding ChildNodes}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Thread}" ItemsSource="{Binding ChildNodes}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Name, StringFormat='{}{0} '}" />
<TextBlock Text="{Binding Path=ID, StringFormat=(ID: {0})}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:SubNode}" ItemsSource="{Binding ChildNodes}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>