Show / Hide Table of Contents

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

Возможны ситуации, когда необходимо выполнить привязку 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="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>

См. также

  • Общие сведения о привязке данных
  • Общие сведения о шаблонах данных
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX