Como: Vincular a um TreeView para dados que possuem uma profundidade de Indeterminable
Pode haver ocasiões em que você deseja vincular uma TreeView a uma fonte de dados cuja profundidade é conhecido. Isso pode ocorrer quando os dados são recursivas por natureza, como, por exemplo, um sistema de arquivos, onde as pastas podem conter pastas, ou a estrutura organizacional de uma empresa, onde os funcionários têm outros funcionários, como relatórios diretos.
A fonte de dados deve ter um modelo de objeto hierárquicos. Por exemplo, um Employee classe pode conter uma coleção de objetos do funcionário que são os relatórios diretos de um funcionário. Se os dados são representados de forma que não é hierárquica, você deve criar uma representação hierárquica dos dados.
Ao definir o ItemsControl.ItemTemplate propriedade e se a ItemsControl gera um ItemsControl para cada item do filho, em seguida, o filho ItemsControl usa o mesmo ItemTemplate como o pai. Por exemplo, se você definir a ItemTemplate propriedade em um data-bound TreeView, cada TreeViewItem ou seja gerada usa a DataTemplate que foi atribuída ao ItemTemplate propriedade da TreeView.
O HierarchicalDataTemplate permite que você especifique o ItemsSource para um TreeViewItem, ou qualquer HeaderedItemsControl, no modelo de dados. Ao definir o HierarchicalDataTemplate.ItemsSource propriedade, que o valor é usado quando o HierarchicalDataTemplate é aplicado. Usando um HierarchicalDataTemplate, você pode definir de forma recursiva os ItemsSource para cada TreeViewItem na TreeView.
Exemplo
O exemplo a seguir demonstra como vincular um TreeView para dados hierárquicos e usar um HierarchicalDataTemplate para especificar o ItemsSource para cada TreeViewItem. O TreeView vincula dados XML que representam os funcionários em uma empresa. Cada Employee elemento pode conter outros Employee elementos para indicar quem responde para quem. Como os dados são recursivas, a HierarchicalDataTemplate pode ser aplicado a cada nível.
<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>