Freigeben über


Vorgehensweise: Binden einer Strukturansicht an Daten mit unbestimmter Tiefe

Es kann vorkommen, dass Sie eine TreeView Bindung an eine Datenquelle durchführen möchten, deren Tiefe nicht bekannt ist. Dies kann auftreten, wenn die Daten in der Natur rekursiv sind, z. B. ein Dateisystem, in dem Ordner Ordner enthalten können, oder die Organisationsstruktur eines Unternehmens, bei denen Mitarbeiter andere Mitarbeiter als direkte Berichte haben.

Die Datenquelle muss über ein hierarchisches Objektmodell verfügen. Eine Klasse kann z. B. eine Sammlung von Employee-Objekten enthalten, Employee die die direkten Berichte eines Mitarbeiters sind. Wenn die Daten auf eine Weise dargestellt werden, die nicht hierarchisch ist, müssen Sie eine hierarchische Darstellung der Daten erstellen.

Wenn Sie die ItemsControl.ItemTemplate-Eigenschaft festlegen und das ItemsControl-Element für jedes untergeordnete Element ein ItemsControl generiert, dann verwendet das Kind ItemsControl dasselbe ItemTemplate wie das Elternteil. Wenn Sie beispielsweise die ItemTemplate-Eigenschaft für eine datengebundene TreeView festlegen, verwendet jedes generierte TreeViewItem die DataTemplate-Eigenschaft, die der ItemTemplate-Eigenschaft des TreeView zugewiesen wurde.

Mit HierarchicalDataTemplate können Sie die ItemsSource für eine TreeViewItem oder beliebige HeaderedItemsControl auf der Datenvorlage angeben. Wenn Sie die HierarchicalDataTemplate.ItemsSource Eigenschaft festlegen, wird dieser Wert verwendet, wenn die HierarchicalDataTemplate Eigenschaft angewendet wird. Mit einem HierarchicalDataTemplate können Sie rekursiv die ItemsSource für jedes TreeViewItem in der TreeView setzen.

Beispiel

Im folgenden Beispiel wird veranschaulicht, wie Sie ein TreeView an hierarchische Daten binden und ein HierarchicalDataTemplate verwenden, um das ItemsSource für jedes TreeViewItem anzugeben. TreeView bindet sich an XML-Daten, die die Mitarbeiter in einem Unternehmen darstellen. Jedes Employee Element kann andere Employee Elemente enthalten, um anzugeben, wer wem berichtet. Da die Daten rekursiv sind, kann dies HierarchicalDataTemplate auf jede Ebene angewendet werden.

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

Siehe auch