如何:将 TreeView 绑定到深度无法确定的数据
有时,你可能想要将 TreeView 绑定到其深度未知的数据源。 当数据本质上是递归的(例如文件系统中文件夹可以包含文件夹,公司组织结构中员工可以有下属员工)时,可能会发生这种情况。
数据源必须具有分层对象模型。 例如,Employee
类可能包含一组 Employee 对象,这些对象是某位员工的直接下属。 如果数据以非分层方式表示,则必须生成数据的分层表示形式。
设置 ItemsControl.ItemTemplate 属性时,如果 ItemsControl 为每个子项生成 ItemsControl,则子 ItemsControl 使用与父项相同的 ItemTemplate。 例如,如果在数据绑定 TreeView 上设置 ItemTemplate 属性,则生成的每个 TreeViewItem 都使用分配给 TreeView 的 ItemTemplate 属性的 DataTemplate。
使用 HierarchicalDataTemplate,您可以在数据模板上为 TreeViewItem或任何 HeaderedItemsControl指定 ItemsSource。 设置 HierarchicalDataTemplate.ItemsSource 属性时,应用 HierarchicalDataTemplate 时将使用该值。 通过使用 HierarchicalDataTemplate,可以为 TreeView 中的每个 TreeViewItem 以递归方式设置 ItemsSource。
例
下面的示例演示如何将 TreeView 绑定到分层数据,并使用 HierarchicalDataTemplate 为每个 TreeViewItem指定 ItemsSource。 TreeView 与表示公司员工的 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>