Partilhar via


Como: Vincular um TreeView a dados que têm uma profundidade indeterminável

Pode haver momentos em que você queira vincular um TreeView a uma fonte de dados cuja profundidade não é conhecida. Isso pode ocorrer quando os dados são de natureza recursiva, como um sistema de arquivos, onde as pastas podem conter pastas, ou a estrutura organizacional de uma empresa, onde os funcionários têm outros funcionários como subordinados diretos.

A fonte de dados deve ter um modelo de objeto hierárquico. Por exemplo, uma classe Employee pode conter uma coleção de objetos Employee que são os relatórios diretos de um funcionário. Se os dados forem representados de uma forma que não seja hierárquica, você deverá criar uma representação hierárquica dos dados.

Quando você define a propriedade ItemsControl.ItemTemplate e se o ItemsControl gera um ItemsControl para cada item filho, o filho ItemsControl usa o mesmo ItemTemplate que o pai. Por exemplo, se você definir a propriedade ItemTemplate em um TreeViewassociado a dados, cada TreeViewItem gerado usará o DataTemplate atribuído à propriedade ItemTemplate do TreeView.

O HierarchicalDataTemplate permite especificar o ItemsSource para um TreeViewItem, ou qualquer HeaderedItemsControl, no modelo de dados. Quando você define a propriedade HierarchicalDataTemplate.ItemsSource, esse valor é usado quando o HierarchicalDataTemplate é aplicado. Usando um HierarchicalDataTemplate, você pode definir recursivamente o ItemsSource para cada TreeViewItem no TreeView.

Exemplo

O exemplo a seguir demonstra como vincular um TreeView a dados hierárquicos e usar um HierarchicalDataTemplate para especificar o ItemsSource para cada TreeViewItem. O TreeView vincula-se a dados XML que representam os funcionários de uma empresa. Cada elemento Employee pode conter outros elementos Employee para indicar quem se reporta a quem. Como os dados são recursivos, o HierarchicalDataTemplate pode ser aplicado a cada nível.

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

Ver também

  • Visão Geral da Vinculação de Dados
  • Visão geral da templatização de dados