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をセットする。
その他のソースはこちらを参照

コメント
コメントを投稿