Share via


方法: 深度がわからないデータに TreeView をバインドする

深さがわからないデータ ソースに TreeView をバインドすることが必要な場合があります。 これは、本質的にデータが再帰的な場合に起こります。たとえば、フォルダーにフォルダーを格納できるファイル システム、従業員が他の従業員を直属の部下とする会社の組織構造などがそうです。

データ ソースには、階層オブジェクト モデルが必要です。 たとえば、Employee クラスには、ある従業員の直属の部下である Employee オブジェクトのコレクションが含まれていることがあります。 データが階層化されていない方法で表されている場合は、データの階層表現を作成する必要があります。

ItemsControl.ItemTemplate プロパティを設定すると、ItemsControl によって各子項目の ItemsControl が生成される場合に、子 ItemsControl では親と同じ ItemTemplate が使用されます。 たとえば、データ バインド TreeViewItemTemplate プロパティを設定する場合、生成される各 TreeViewItem では、TreeViewItemTemplate プロパティに割り当てられた DataTemplate が使用されます。

HierarchicalDataTemplate を使用すると、データ テンプレートで TreeViewItemItemsSource、またはいずれかの HeaderedItemsControl を指定できます。 HierarchicalDataTemplate.ItemsSource プロパティを設定すると、HierarchicalDataTemplate が適用される場合に、その値が使用されます。 HierarchicalDataTemplate を使用することで、TreeView 内の各 TreeViewItemItemsSource を再帰的に設定できます。

次の例では、TreeView を階層データにバインドし、HierarchicalDataTemplate を使用して各 TreeViewItemItemsSource を指定する方法を示します。 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>

関連項目