Gör så här: Binda en TreeView till data som har ett obestämt djup

Det kan finnas tillfällen då du vill binda en TreeView till en datakälla vars djup inte är känt. Detta kan inträffa när data är rekursiva till sin natur, till exempel ett filsystem, där mappar kan innehålla mappar eller ett företags organisationsstruktur, där anställda har andra anställda som direkta rapporter.

Datakällan måste ha en hierarkisk objektmodell. En Employee-klass kan till exempel innehålla en samling Medarbetarobjekt som är direkta rapporter för en anställd. Om data representeras på ett sätt som inte är hierarkiskt måste du skapa en hierarkisk representation av data.

När du anger egenskapen ItemsControl.ItemTemplate och om ItemsControl genererar en ItemsControl för varje underordnat objekt, använder det underordnade barnet ItemsControl samma ItemTemplate som föräldern. Om du till exempel anger egenskapen ItemTemplate på en databunden TreeViewanvänder varje TreeViewItem som genereras den DataTemplate som tilldelades egenskapen ItemTemplate för TreeView.

Med HierarchicalDataTemplate kan du ange ItemsSource för en TreeViewItem, eller någon HeaderedItemsControl, i datamallen. När du anger egenskapen HierarchicalDataTemplate.ItemsSource används det värdet när HierarchicalDataTemplate används. Med hjälp av en HierarchicalDataTemplatekan du rekursivt ange ItemsSource för varje TreeViewItem i TreeView.

Exempel

I följande exempel visas hur du binder en TreeView till hierarkiska data och använder en HierarchicalDataTemplate för att ange ItemsSource för varje TreeViewItem. TreeView binder till XML-data som representerar anställda i ett företag. Varje Employee element kan innehålla andra Employee element för att ange vem som rapporterar till vem. Eftersom data är rekursiva kan HierarchicalDataTemplate tillämpas på varje nivå.

<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>

Se även