방법: 깊이를 확인할 수 없는 데이터에 TreeView 바인딩
깊이를 알 수 없는 데이터 원본에 TreeView를 바인딩하려는 경우가 있을 수 있습니다. 이는 폴더에 폴더가 포함될 수 있는 파일 시스템이나, 직원이 다른 직원을 직접 보고하는 회사의 조직 구조와 같이 본질적으로 데이터가 재귀적일 때 발생할 수 있습니다.
데이터 원본에는 계층적 개체 모델이 있어야 합니다. 예를 들어 Employee
클래스에는 직원의 직접 보고서인 Employee 개체의 컬렉션이 포함될 수 있습니다. 데이터가 계층 구조가 아닌 방식으로 표현되는 경우 데이터의 계층적 표현을 빌드해야 합니다.
ItemsControl.ItemTemplate 속성을 설정하고 ItemsControl이 각 자식 항목에 대해 ItemsControl을 생성하는 경우 자식 ItemsControl은 부모와 동일한 ItemTemplate을 사용합니다. 예를 들어 데이터 바인딩된 TreeView에서 ItemTemplate 속성을 설정하는 경우 생성된 각 TreeViewItem 속성은 TreeView의 ItemTemplate 속성에 할당된 DataTemplate 속성을 사용합니다.
HierarchicalDataTemplate을 통해 데이터 템플릿에서 TreeViewItem에 대한 ItemsSource 또는 모든 HeaderedItemsControl 항목을 지정할 수 있습니다. HierarchicalDataTemplate.ItemsSource 속성을 설정하면 HierarchicalDataTemplate이 적용될 때 해당 값이 사용됩니다. HierarchicalDataTemplate을 사용하면 TreeView의 각 TreeViewItem에 대해 ItemsSource를 재귀적으로 설정할 수 있습니다.
예제
다음 예제에서는 계층적 데이터에 TreeView를 바인딩하고 HierarchicalDataTemplate을 사용하여 각각 TreeViewItem에 대해 ItemsSource를 지정하는 방법을 보여 줍니다. 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>
참고 항목
.NET Desktop feedback