Partager via


Comment : lier un TreeView à des données dont la profondeur ne peut pas être déterminée

Il peut arriver que vous souhaitiez lier une TreeView source de données dont la profondeur n’est pas connue. Cela peut se produire lorsque les données sont récursives par nature, comme un système de fichiers, où les dossiers peuvent contenir des dossiers ou la structure organisationnelle d’une entreprise, où les employés ont d’autres employés comme rapports directs.

La source de données doit avoir un modèle objet hiérarchique. Par exemple, une Employee classe peut contenir une collection d’objets Employee qui sont les rapports directs d’un employé. Si les données sont représentées d’une manière qui n’est pas hiérarchique, vous devez créer une représentation hiérarchique des données.

Lorsque vous définissez la ItemsControl.ItemTemplate propriété et si la ItemsControl génération d’un ItemsControl élément enfant, l’enfant ItemsControl utilise la même chose ItemTemplate que le parent. Par exemple, si vous définissez la ItemTemplate propriété sur une liaison TreeViewde données, chacune TreeViewItem générée utilise celle DataTemplate qui a été affectée à la ItemTemplate propriété du TreeView.

Le HierarchicalDataTemplate modèle de données vous permet de spécifier le ItemsSource modèle de données pour un TreeViewItemmodèle de données.HeaderedItemsControl Lorsque vous définissez la HierarchicalDataTemplate.ItemsSource propriété, cette valeur est utilisée lors de l’application HierarchicalDataTemplate . À l’aide d’un HierarchicalDataTemplate, vous pouvez définir de manière récursive la ItemsSource valeur de chacun TreeViewItem dans le TreeView.

Exemple

L’exemple suivant montre comment lier un TreeView à des données hiérarchiques et utiliser un HierarchicalDataTemplate pour spécifier la ItemsSource valeur de chaque TreeViewItem. L’objet TreeView est lié aux données XML qui représentent les employés d’une entreprise. Chaque Employee élément peut contenir d’autres Employee éléments pour indiquer qui signale à qui. Étant donné que les données sont récursives, elles HierarchicalDataTemplate peuvent être appliquées à chaque niveau.

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

Voir aussi