複数コンテンツを保持するコントロールのカスタマイズ
前回ご説明した通り、TreeViewコントロールは複数コンテンツを取り扱うItemsControlの派生クラスになります。
ItemsControlも先ほどのコントロール同様、Templateプロパティがあります。もちろん、先ほどと同様ControlTemplateを設定することでコントロールの表示方法をカスタマイズできます。
そして、ItemsControlのTemplateには複数コントロールを取り扱うためのPresenterコントロール、ItemsPresenterコントロールが設定されています。
ItemsPresenterは複数あるコンテンツを表示するため、先ほどのButtonのようなContentControlの派生クラスの役割に加えて、ItemsControlの持つプロパティを利用して複数コンテンツを取り扱うための方法の設定が行うことが可能です。
そこで、ItemsControlはこういったカスタマイズするために4つの主要なプロパティが用意されています。
これらがItemContainerGenerator・ItemContainerStyle・ItemTemplate・ItemsPanelという4つのプロパティになります。
それぞれ、順を追ってご説明しましょう。
ItemContainerGenerator
まず、ItemsControlは複数ある個々のオブジェクトを表示するために、オブジェクト表示用のコントロールの生成を行います。
この生成にはコントロールを生成する役割を持つGeneratorオブジェクトを指定するItemContainerGeneratorプロパティを持ちます。
ItemContainerGeneratorプロパティには、その名前のとおり個々のコンテンツを表示するためのコントロールの生成を行うItemContainerGeneratorクラスのオブジェクトを設定することができます。
ItemsControlはItemsやItemsSourceに設定されたコレクションのオブジェクトの数だけ、このGeneratorオブジェクトを使用してコントロールを生成します。
当然、生成されるコントロールの種類はItemsControlの種類ごとに内容が異なります。
今回の本題であるTreeViewコントロールにはTreeViewItemコントロールが生成されるGeneratorが設定されています。
つまり、TreeViewコントロールの中で表示されている明細を表示しているコントロールはTreeViewItemコントロールになります。
TreeViewItemコントロールはHeaderedItemsControl、つまりヘッダー付の複数コンテンツを取り扱うことができるコントロールとなっています。
ItemContainerStyle
ItemsControlはItemContainerGeneratorで生成されたコントロールを利用して表示を行います。そして、このGeneratorで生成されたコントロールを対象にしたStyleオブジェクトを指定することができるプロパティがこちらのItemContainerStyleプロパティになります。
TreeViewコントロールではTreeViewItemコントロールに対して適用するStyleが設定されています。
ItemTemplate
先ほどご紹介したItemContainerStyleにはGeneratorで生成されたコントロールに適用するControlTemplateも定義されています。特に指定がない場合、個々のコントロールにはこのTemplate設定に基づき表示されますが、これとは別に個々のコントロールに対してのテンプレートの定義を行うことができるのがItemTemplateになります。
ItemControlはItemTemplateに定義されたTemplateがあった場合、ItemContainerStyleに定義されているTemplate設定を上書きします。
そのため、ItemTemplateの設定が存在した場合はそれが優先されてTemplateとして適用されることになります。
ItemsPanel
複数コントロールを取り扱う際に、個々のコントロールが決定しても、それらの表示をどのように行うかというレイアウトの問題が発生します。
このような複数のオブジェクトのレイアウトはItemsPanelに設定されているPanelコントロールにより挙動が決まります。
ItemsPanelプロパティにはItemsPanelTemplateを指定できます。
ItemsPanelTemplateはItemsControlのレイアウト用に利用するパネルコントロールを指定するためのTemplateで、Panelコントロールを指定することができます。
TreeViewコントロールには表示用のパネルとして既定ではStackPanelが設定されていますので、垂直方向へ積み重ねるように表示されています。
TreeViewコントロールのカスタマイズ
TreeViewコントロールにはItemsControlの持つこのようなプロパティを保持していますが、先ほどご説明した通り、TreeViewコントロールは表示のためにHeaderedItemsControlの派生クラスであるTreeViewItemコントロールを利用しています。
ヘッダー付き複数コンテンツを取り扱うコントロールを利用し、それらのコントロールを再帰的に呼び出すことで階層構造となるデータの表示が行われています。
つまり、通常のItemsControlに比べると、階層構造を表現するために新たなHeaderedItemsControlを自動生成するという形になっています。
そのため、そういった階層構造で生成されたコントロールに対して適用するTemplateプロパティとしてHierarchicalDataTemplateプロパティが用意されています。