複数のオブジェクトを指定された表示方法で並べるためのコントロールです。
オブジェクトには string 型からユーザコントロールまでなんでもいけるので使いどころは様々です。
ComboBox コントロールや ListBox コントロールなど、
ItemsSource プロパティを持っているコントロールは大概この ItemsControl から派生しているため、
それぞれの ItemTemplate プロパティなんかを指定するだけでもかなり UI デザインの幅が広がります。
アイテムの表示方法を指定するためのプロパティとして
Template、ItemsPanel、ItemTemplate、ItemContainerStyle という 4 つのプロパティがあります。
ここではこれらのプロパティの使い方について紹介します。
ページ内リンク
概要
アイテムの表示方法は Template、ItemsPanel、ItemTemplate、ItemContainerStyle という 4 つのプロパティで指定しますが、
これらのプロパティによって指定される表示領域は次のような関係になります。
Template プロパティでアイテムを並べる ItemsPanel を含む外観を定義します。
ItemsPanel プロパティでアイテムを並べる Panel コントロールを指定します。
ItemContainerStyle プロパティでコンテナ要素の動作を設定します。
ItemTemplate プロパティで各アイテムの表示方法を指定します。
Template プロパティ
Template プロパティには ControlTemplate を指定します。
コントロールそのものに枠線を付けたり、背景色を設定したりします。
また、アイテムコレクションをコントロールのどの部分に配置するかをここで決定します。
例えば次のコードでは、枠線を指定した Border コントロールの中にアイテムコレクションを配置しています。
ItemsPanel プロパティ
ItemsPanel プロパティに指定したパネルにしたがって、
アイテムがアイテムコレクションに並べられます。
パネルには StackPanel や WrapPanel を使用するのが一般的ですが、
Grid や Canvas なども使用することができます。
この時点では、各アイテムに余白を付けるなどの設定をしていないため、多少見苦しくなっています。
また、StackPanel を使用しているため、コントロールからはみ出した部分は描画されずにはみ出したままとなっています。
WrapPanel コントロールにすると、下図のようにはみ出た部分が自動的に配置されるようになります。
そうじゃなくてスクロールバーを表示させたいという場合は、
Template プロパティに戻って、ItemsPresenter コントロールを ScrollViewer コントロールの中に入れます。
ItemsPanel に Grid を指定すると、
Grid には子要素を順番に並べる機能がないため、
下図のようにすべてのアイテムが重なってしまいます。
各アイテムに Margin に関する情報を持たせたり、
動的に Grid の Row や Column に関する情報を設定したりする仕組みを作り込むことで
Grid を ItemsPanel とした ItemsControl が役に立つかもしれません。
が、そこまでするようなコントロールを作らなければならない場面に遭遇したことはありません。
ItemTemplate プロパティ
ItemTemplate プロパティには各アイテムの表示方法を指定するための DataTemplate を指定します。
ここでは表示するアイテムのサンプルとして次のような Person クラスを定義し、
ViewModel で Persons プロパティとしてリストを持ちます。
そして、ItemsPanel に横並びの WrapPanel を指定した場合のコードを使って、
ViewModel の持つ Persons プロパティとバインドした ItemsControl コントロールを対象とし、
ItemsSource プロパティには上記の Persons プロパティをデータバインドします。
まず ItemTemplate プロパティを指定しない場合のコードと実行結果を示します。
横並びとはいえ、1 個ではみ出てしまうので縦並びのように見えてしまってます。
これに対して ItemTemplate として Name プロパティと Age プロパティを表示させます。
この時点で各アイテムに背景色を付けたりもできますが、
選択された or されてないなどによって動的にしたいため、
そのような設定は ItemContainerStyle プロパティでおこないます。
ItemContainerStyle プロパティ
ItemContainerStyle プロパティはアイテムコレクションの各コンテナ要素の設定を変更するためのプロパティです。
しかし、コンテナ要素は ItemsControl の派生コントロールごとに異なります。
ComboBox のコンテナは ComboBoxItem、ListBox のコンテナは ListBoxItem となります。
ここでは ItemsControl を ListBox に変更し、
ListBoxItem に対する設定を変更することで、
選択されたアイテムの背景色を変更します。
まとめ
以上 4 つのプロパティによって ItemsControl もしくはその派生コントロールのアイテム表示方法を指定する方法を紹介しました。
要約すると次のようになります。
- Template プロパティ
コントロールの外観を決定
- ItemsPanel プロパティ
アイテムを並べるための Panel 派生のコントロールを決定
- ItemTemplate
ItemsSource にデータバインドされた個々のデータの外観を決定
- ItemsContainerStyle
コンテナ要素の外観を決定
ItemsControl 派生のコントロールは使いこなすと UI のデザインにかなりの幅が出るので、
ぜひマスターしましょう。