C#のWPFで色選択コントロールを自作する その3

前回前々回に続いて、色を選択するコントロールを作成してみる

 

今度はソースの方。


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を呼び出す。 

 

つづく