如何:将 TreeView 绑定到深度无法确定的数据

有时,你可能想要将 TreeView 绑定到其深度未知的数据源。 当数据本质上是递归的(例如文件系统中文件夹可以包含文件夹,公司组织结构中员工可以有下属员工)时,可能会发生这种情况。

数据源必须具有分层对象模型。 例如,Employee 类可能包含一组 Employee 对象,这些对象是某位员工的直接下属。 如果数据以非分层方式表示,则必须生成数据的分层表示形式。

设置 ItemsControl.ItemTemplate 属性时,如果 ItemsControl 为每个子项生成 ItemsControl,则子 ItemsControl 使用与父项相同的 ItemTemplate。 例如,如果在数据绑定 TreeView 上设置 ItemTemplate 属性,则生成的每个 TreeViewItem 都使用分配给 TreeViewItemTemplate 属性的 DataTemplate

使用 HierarchicalDataTemplate,您可以在数据模板上为 TreeViewItem或任何 HeaderedItemsControl指定 ItemsSource。 设置 HierarchicalDataTemplate.ItemsSource 属性时,应用 HierarchicalDataTemplate 时将使用该值。 通过使用 HierarchicalDataTemplate,可以为 TreeView 中的每个 TreeViewItem 以递归方式设置 ItemsSource

下面的示例演示如何将 TreeView 绑定到分层数据,并使用 HierarchicalDataTemplate 为每个 TreeViewItem指定 ItemsSourceTreeView 与表示公司员工的 XML 数据相绑定。 每个 Employee 元素可以包含其他 Employee 元素,以指示向谁报告谁。 由于数据是递归的,因此 HierarchicalDataTemplate 可以应用于每个级别。

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
    <XmlDataProvider x:Key="myCompany" XPath="Company/Employee">
      <x:XData>
        <Company xmlns="">
          <Employee Name="Don Hall">
            <Employee Name="Alice Ciccu">
              <Employee Name="David Pelton">
                <Employee Name="Vivian Atlas"/>
              </Employee>
              <Employee Name="Jeff Price"/>
              <Employee Name="Andy Jacobs"/>
            </Employee>
            <Employee Name="Bill Malone">
              <Employee Name="Maurice Taylor"/>
              <Employee Name="Sunil Uppal"/>
              <Employee Name="Qiang Wang"/>
            </Employee>
          </Employee>
        </Company>
      </x:XData>
    </XmlDataProvider>

    <!-- Bind the HierarchicalDataTemplate.ItemsSource property to the employees under
         each Employee element. -->
    <HierarchicalDataTemplate x:Key="EmployeeTemplate" 
                              ItemsSource="{Binding XPath=Employee}">
      <TextBlock Text="{Binding XPath=@Name}" ></TextBlock>
    </HierarchicalDataTemplate>

    <Style TargetType="TreeViewItem">
      <Setter Property="IsExpanded" Value="True"/>
    </Style>
  </Page.Resources>

  <Grid>
    <TreeView ItemsSource="{Binding Source={StaticResource myCompany}}" 
              ItemTemplate="{StaticResource EmployeeTemplate}"/>
  </Grid>
</Page>

另请参阅