共用方式為


如何:將樹狀檢視繫結至未知深度的資料

有時候,您可能想要將 TreeView 繫結至其深度未知的資料來源。 當本質上是遞迴的資料時 (例如檔案系統、可以包含資料夾的資料夾,或公司的組織結構,其中員工有其他員工直接報告) 就可能會發生此情況。

資料來源必須具有階層式物件模型。 例如,Employee 類別可能包含員工直接報告的 Employee 物件集合。 如果資料是以非階層式的方式表示,您必須建置資料的階層式表示法。

當您設定 ItemsControl.ItemTemplate 屬性,如果 ItemsControl 為每個子項目產生 ItemsControl,則子系 ItemsControl 會使用與父系相同的 ItemTemplate。 例如,如果您在資料繫結 TreeView 上設定 ItemTemplate 屬性,則產生的每個 TreeViewItem 都會使用指派給 TreeViewItemTemplate 屬性的 DataTemplate

HierarchicalDataTemplate 可讓您在資料範本上指定 TreeViewItemItemsSource,或是任何 HeaderedItemsControl。 當您設定 HierarchicalDataTemplate.ItemsSource 屬性時,會在套用 HierarchicalDataTemplate 時使用該值。 藉由使用 HierarchicalDataTemplate,您可以遞迴方式設定 TreeView 中每個 TreeViewItemItemsSource

範例

下列範例示範如何將 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>

另請參閱