Практическое руководство. Привязка элемента управления 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>