Compartir a través de


Cómo: Enlazar un objeto TreeView a datos que tienen una profundidad indeterminable

Es posible que haya ocasiones en las que quiera enlazar TreeView a 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 otros empleados como informes directos.

El origen de datos debe tener un modelo de objetos jerárquico. Por ejemplo, una clase Employee 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 propiedad ItemsControl.ItemTemplate y si ItemsControl genera un objeto ItemsControl para cada elemento secundario, el elemento secundario ItemsControl usa el mismo ItemTemplate que el elemento primario. Por ejemplo, si establece la propiedad ItemTemplate en un objeto TreeView enlazado a datos, cada uno de los objetos TreeViewItem que se genera usa el elemento DataTemplate que se asignó a la propiedad ItemTemplate de TreeView.

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

Ejemplo

En el ejemplo siguiente se muestra cómo enlazar un objeto TreeView a datos jerárquicos y usar HierarchicalDataTemplate para especificar ItemsSource para cada TreeViewItem. TreeView enlaza a datos XML que representan a los empleados de una empresa. Cada elemento Employee puede contener otros elementos Employee 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>

Vea también