Compartir a través de


Cómo: Enlazar una vista de árbol a datos que tiene una profundidad indeterminable

Es posible que haya ocasiones en las que quiera enlazar a TreeView un origen de datos cuya profundidad no se conoce. Esto puede ocurrir cuando los datos son recursivos por naturaleza, como un sistema de archivos, donde las carpetas pueden contener carpetas o la estructura organizativa de una empresa, donde los empleados tienen a otros empleados como informes directos.

El origen de datos debe tener un modelo de objetos jerárquico. Por ejemplo, una Employee clase podría contener una colección de objetos Employee que son los informes directos de un empleado. Si los datos se representan de una manera que no es jerárquica, debe crear una representación jerárquica de los datos.

Al establecer la ItemsControl.ItemTemplate propiedad y si ItemsControl genera un ItemsControl para cada elemento secundario, el elemento secundario ItemsControl usa lo mismo ItemTemplate que el elemento primario. Por ejemplo, si establece la ItemTemplate propiedad en un enlazado a TreeViewdatos , cada TreeViewItem uno de los que se genera usa el DataTemplate que se asignó a la ItemTemplate propiedad de TreeView.

HierarchicalDataTemplate permite especificar para ItemsSource , TreeViewItemo cualquier HeaderedItemsControl, en la plantilla de datos. Al establecer la HierarchicalDataTemplate.ItemsSource propiedad , ese valor se usa cuando HierarchicalDataTemplate se aplica . Mediante un HierarchicalDataTemplate, puede establecer de forma recursiva el ItemsSource para cada TreeViewItem en el TreeView.

Ejemplo

En el ejemplo siguiente se muestra cómo enlazar a datos TreeView jerárquicos y usar para HierarchicalDataTemplate especificar para ItemsSource cada TreeViewItem. Enlaza TreeView a datos XML que representan a los empleados de una empresa. Cada Employee elemento puede contener otros Employee elementos para indicar quién informa a quién. Dado que los datos son recursivos, HierarchicalDataTemplate se puede aplicar a cada nivel.

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

Consulte también