Como associar um TreeView a dados que tenham uma profundidade indeterminável
Pode haver momentos em que você deseja vincular um TreeView a uma fonte de dados cuja profundidade não é conhecida. Isso pode ocorrer quando os dados são recursivos por natureza, como um sistema de arquivos, em que as pastas podem conter pastas, ou a estrutura organizacional da empresa, em que os funcionários têm outros funcionários como subordinados diretos.
A fonte de dados deve ter um modelo de objeto hierárquico. Por exemplo, uma classe Employee
pode conter uma coleção de objetos Funcionários que são subordinados diretos de um funcionário. Se os dados forem representados de forma não hierárquica, será necessário compilar uma representação hierárquica dos dados.
Quando você define a ItemsControl.ItemTemplate propriedade e se o gera um ItemsControl para cada item filho, o filho ItemsControl usa o mesmo ItemTemplate que o ItemsControl pai. Por exemplo, se você definir a propriedade em um associado a ItemTemplateTreeViewdados, cada TreeViewItem um que é gerado usa o DataTemplate que foi atribuído à ItemTemplate propriedade do TreeView.
O HierarchicalDataTemplate permite que você especifique o ItemsSource para um TreeViewItem, ou qualquer HeaderedItemsControl, no modelo de dados. Quando você define a HierarchicalDataTemplate.ItemsSource propriedade, esse valor é usado quando o HierarchicalDataTemplate é aplicado. Usando um HierarchicalDataTemplate, você pode definir recursivamente o ItemsSource para cada TreeViewItem no TreeView.
Exemplo
O exemplo a seguir demonstra como vincular a a dados hierárquicos e usar a TreeViewHierarchicalDataTemplate para especificar o ItemsSource para cada TreeViewItem. O TreeView vincula a dados XML que representam os funcionários em uma empresa. Cada elemento Employee
pode conter outros elementos Employee
para indicar quem responde a quem. Como os dados são recursivos, o HierarchicalDataTemplate pode ser aplicado a cada nível.
<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>
Confira também
.NET Desktop feedback