如何在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%正确的,这只是一个例子)

如何在XAML中具有递归或层次结构列表和子列表

因此必须使用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>