WPFでは、テンプレートを使って見た目を自由にカスタマイズ出来る。
さらに、データの条件によってテンプレートを使い分ける事も可能。
以下の例では、ComboBoxのグループヘッダーを別々の色にしている。
手順は以下の通り。
DataTemplateSelectorを作成
DataTemplateSelectorクラスから派生した独自のクラスを作成する。
必要な数だけDataTemplate型のプロパティを作っておき、SelectTemplateメソッドをオーバーライドして条件にあったDateTemplateを戻り値とするようコーディングする。
public class ComboHeaderTemplateSelector : DataTemplateSelector { public DataTemplate Template1 { get; set; } public DataTemplate Template2 { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { CollectionViewGroup group = (CollectionViewGroup)item; if ("CategoryA" == group.Name.ToString()) return Template1; else return Template2; } }
2つのDateTemplate型プロパティを作成している。
作成したTemplate1、Template2の中身についてはXAML側から定義を行う。
SelectTemplateメソッドでは引数itemにバインドされたデータが渡ってくる。
ComboBoxのヘッダー欄の場合、ListCollectionViewのGroupsプロパティが参照されるGroupsプロパティはCollectionViewGroup型のリストでなので、itemはCollectionViewGroupへキャスト出来る。
それぞれのテンプレートとセレクターを作成
<Window.Resources> <DataTemplate x:Key="MyTemplate1"> <TextBlock Text="{Binding Name}" Background="Aqua"/> </DataTemplate> <DataTemplate x:Key="MyTemplate2"> <TextBlock Text="{Binding Name}" Background="Gold"/> </DataTemplate> <local:ComboHeaderTemplateSelector x:Key="MySelector" Template1="{StaticResource MyTemplate1}" Template2="{StaticResource MyTemplate2}"/> </Window.Resources> <StackPanel Margin="10"> <ComboBox x:Name="comboBox"> <ComboBox.GroupStyle> <GroupStyle HeaderTemplateSelector="{StaticResource MySelector}"/> </ComboBox.GroupStyle> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Title}"/> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </StackPanel>
Windows.Resource内にそれぞれのDataTemplateを定義。
上記で作成したTemplateSelectorも定義し、Template1、template2へDateTemplateをセット。
ComboBox.GroupStyleのHeaderTemplateSelectorへ作成したTemplateSelectorをセットする。
その他のソースはこちらを参照
コメントをお書きください