次の方法で共有


方法: TreeView を、不確定な深さを持つデータにバインドする

深さが不明なデータ ソースに TreeView をバインドしたい場合があります。 これは、ファイル システム、フォルダーにフォルダーを含めることができる場合、または従業員が直属の部下として他の従業員を持つ会社の組織構造など、本質的にデータが再帰的である場合に発生する可能性があります。

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

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

HierarchicalDataTemplateを使用すると、データ テンプレートのItemsSourceまたは任意のTreeViewItemHeaderedItemsControlを指定できます。 HierarchicalDataTemplate.ItemsSource プロパティを設定すると、HierarchicalDataTemplateが適用されるときにその値が使用されます。 HierarchicalDataTemplateを使用すると、ItemsSource内の各TreeViewItemTreeViewを再帰的に設定できます。

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

こちらも参照ください