有时您可能需要将 TreeView 绑定到深度未知的数据源。
如果数据具有递归性质,则可能会发生这种情况;文件系统或公司的组织结构就属于这种数据,在文件系统中,文件夹还可以包含文件夹,在公司的组织结构中,员工又有自己的直属员工。
数据源必须有分层的对象模型。
例如,一个 Employee 类可能包含一个由 Employee 对象组成的集合,其中的每个对象都是一位员工的直属员工。
如果数据以未分层方式表示,则您必须构建该数据的分层表示形式。
设置 ItemsControl.
ItemTemplate 属性时,如果 ItemsControl 为每个子项生成了一个 ItemsControl,则子级 ItemsControl 使用同一 ItemTemplate 作为父级。
ItemTemplate 属性时,如果 ItemsControl 为每个子项生成了一个 ItemsControl,则子级 ItemsControl 使用同一 ItemTemplate 作为父级。
例如,如果设置绑定到数据的 TreeView 的 ItemTemplate 属性,则所生成的每个 TreeViewItem 都会使用分配给 TreeView 的 ItemTemplate 属性的 DataTemplate。
借助 HierarchicalDataTemplate,您可以在数据模板中为 TreeViewItem 或任何 HeaderedItemsControl 指定 ItemsSource。
设置 HierarchicalDataTemplate.
ItemsSource 属性后,在应用 HierarchicalDataTemplate 时会使用该值。
ItemsSource 属性后,在应用 HierarchicalDataTemplate 时会使用该值。
通过使用 HierarchicalDataTemplate,您可以以递归方式为 TreeView 中的每个 TreeViewItem 设置 ItemsSource。
<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>