有時候,您可能想要將 TreeView 繫結至其深度未知的資料來源。 當本質上是遞迴的資料時 (例如檔案系統、可以包含資料夾的資料夾,或公司的組織結構,其中員工有其他員工直接報告) 就可能會發生此情況。
資料來源必須具有階層式物件模型。 例如,Employee 類別可能包含員工直接報告的 Employee 物件集合。 如果資料是以非階層式的方式表示,您必須建置資料的階層式表示法。
當您設定 ItemsControl.ItemTemplate 屬性,如果 ItemsControl 為每個子項目產生 ItemsControl,則子系 ItemsControl 會使用與父系相同的 ItemTemplate。 例如,如果您在資料繫結 TreeView 上設定 ItemTemplate 屬性,則產生的每個 TreeViewItem 都會使用指派給 TreeView 之 ItemTemplate 屬性的 DataTemplate。
HierarchicalDataTemplate 可讓您在資料範本上指定 TreeViewItem 的 ItemsSource,或是任何 HeaderedItemsControl。 當您設定 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>