Поделиться через


Практическое руководство. Привязка элемента управления TreeView к данным неопределенной глубины

Обновлен: Июль 2008

В некоторых случаях бывает необходимо выполнить привязку элемента управления TreeView к источнику данных, глубина которого неизвестна. Это возможно, если данные имеют рекурсивную природу. Примером таких данных является файловая система, в которой папки могут содержать другие папки, или организационная структура компании, в которой одни сотрудники непосредственно подчинены другим.

Источник данных может иметь иерархическую объектную модель. Например, класс Employee может содержать коллекцию объектов Employee (сотрудник), которые напрямую подчиняются данному сотруднику. Если данные представлены в неиерархическом виде, необходимо построить иерархическое представление данных.

При присвоении значения свойству ItemsControl.ItemTemplate и при создании элементом управления ItemsControl элемента управления ItemsControl для каждого дочернего элемента, дочерний элемент управления ItemsControl использует тот же самый элемент управления ItemTemplate в качестве родительского элемента. Например, при задании свойства ItemTemplate для привязанного к данным элемента управления TreeView каждый созданный элемент TreeViewItem использует объект DataTemplate, присвоенный свойству ItemTemplate элемента управления TreeView.

Объект HierarchicalDataTemplate позволяет указать объект ItemsSource для элемента TreeViewItem или любого элемента управления HeaderedItemsControl в шаблоне данных. При задании свойства HierarchicalDataTemplate.ItemsSource его значение используется при применении шаблона данных HierarchicalDataTemplate. Используя HierarchicalDataTemplate можно рекурсивно задать ItemsSource для каждого элемента TreeViewItem в элементе управления TreeView.

Пример

В приведенном ниже примере демонстрируется привязка элемента управления TreeView к иерархическим данным, а шаблон HierarchicalDataTemplate используется для указания ItemsSource для каждого элемента TreeViewItem. Элемент управления TreeView привязывается к XML-данным о сотрудниках компании. Каждый элемент Employee может содержать другие элементы Employee, чтобы указать, какой сотрудник кому подчиняется. Поскольку данные являются рекурсивными, шаблон HierarchicalDataTemplate можно применить к каждому уровню.

<Page 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>
    <XmlDataProvider x:Key="myCompany" XPath="Company/Employee">
      <x:XData>
        <Company >
          <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>

См. также

Основные понятия

Общие сведения о связывании данных

Общие сведения о шаблонах данных

Журнал изменений

Дата

Изменения

Причина

Июль 2008

Добавленный раздел.

Улучшение информации.