ColorPickerHeaderTemplateSelectorクラス
public class ColorPickerHeaderTemplateSelector : DataTemplateSelector { public DataTemplate Template1 { get; set; } public DataTemplate Template2 { get; set; } public override DataTemplate SelectTemplate(object item, DependencyObject container) { CollectionViewGroup group = (CollectionViewGroup)item; if ("カスタム" != group.Name.ToString()) return Template1; else return Template2; } }
グループの名前が"カスタム"の時だけTemplate2が選択されるように制御。
ColorPickerItemクラス
ItemTemplateにバインドされるデータ構造
public class ColorPickerItem : INotifyPropertyChanged { public string CategoryName { get; set; } public int Column { get; set; } public int Row { get; set; } private Color _ItemColor; public Color ItemColor { get { return _ItemColor; } set { _ItemColor = value; _ItemBrush = new SolidColorBrush(_ItemColor); OnPropertyChanged("ItemColor"); OnPropertyChanged("ItemBrush"); } } private SolidColorBrush _ItemBrush; public Brush ItemBrush { get { return _ItemBrush; } } public string ToolTip { get { return string.Format("#{0:X2}{1:X2}{2:X2}", _ItemColor.R, _ItemColor.G, _ItemColor.B); } } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string name) { if (null == this.PropertyChanged) return; this.PropertyChanged(this, new PropertyChangedEventArgs(name)); } };
CategoryName・・・グループ分けする為の名前
Column,Row ・・・Gridの配置位置
ItemColor ・・・色
ItemBrush ・・・表示する為のカラーブラシ
ToolTip ・・・ツールチップ表示用の16進色コードの文字列
Borderコントロールを使って色を表示しているが、BackgroundはBrush型のプロパティなのでColor型の値をバインド出来ない。その為ItemBrushも持つようにしている。
バインディングによるデータ受け渡しが正しく行われるようにINotifyPropertyChangedインターフェースを実装している。
PropertyChangedEventHandlerとOnPropertyChangedメソッドを実装しつつ、プロパティのセッターでOnPropertyChangedを呼び出す。
関連記事
- WPFで色選択コントロールを自作する その1
- WPFで色選択コントロールを自作する その2
- WPFで色選択コントロールを自作する その3
- WPFで色選択コントロールを自作する その4
コメントをお書きください