如何在XAML中具有递归或层次结构列表和子列表
本文关键字:列表 层次结构 递归 XAML | 更新日期: 2023-09-27 18:28:05
假设我有以下类,Employee
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public ObservableCollection<Employee> Underlings { get; set; }
}
然后我有下面的XAML,绑定到ObservableCollection<Employee> MyEmployees
<ListBox ItemsSource="{Binding Path=MyEmployees}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Tag="{Binding Path=Employee.Id}">
<TextBlock Text="{Binding Path=Employee.Name}"></TextBlock>
<!-- Here's where I declare my underlings -->
<ListBox ItemsSource="{Binding Path=Employee.Underlings}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Tag="{Binding Path=Employee.Id}">
<TextBlock Text="{Binding Path=Employee.Name}"></TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这允许集合MyEmployees
中的每个员工都有一些下属。但这些下属也是雇员类型,可能有自己的下属。如何在不使XAML变得非常复杂的情况下满足这些附加级别的要求?
有没有办法单独声明我的DataTemplate
,并允许它在自己内部被引用?
我必须从代码背后完成所有这些吗?
(我意识到上面的XAML可能不是100%正确的,这只是一个例子)
因此必须使用TreeView
而不是ListBox
。并且您必须指定一个HierarchicalDataTemplate
。
您可以将ListBoxes资源中的DataTemplate定义为Employee:的默认模板
<ListBox ItemsSource="{Binding MyEmployees}">
<ListBox.Resources>
<DataTemplate DataType="{x:Type myns:Employee}">
<Grid Tag="{Binding Id}">
<TextBlock Text="{Binding Name}"></TextBlock>
<ListBox ItemsSource="{Binding Underlings}" />
</Grid>
</DataTemplate>
</ListBox.Resources>
</ListBox>