次の方法で共有


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

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

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

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

HierarchicalDataTemplate を使用すると、データ テンプレートの TreeViewItemまたは任意の HeaderedItemsControlItemsSource を指定できます。 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>

関連項目