C#のWPFでコントロールを自作する その2

こちらの続き。

 

 

DependencyPropertyクラスを使って依存関係プロパティを作成する事で、データをバインド出来るプロパティを作成できた。

 

正確にデータの受け渡しをする為には、Binding.Modeプロパティを理解する必要がある。

モードの違いによって以下のようにデータの受け渡し方が異なる。

Default

  TextBoxやCheckBoxなど双方向が必要そうなやつの場合はTwoWay

  TextBlockなど読み取りだけで済みそうなやつの場合はOneWay

 

OneTime

  最初の1回だけ値を取得する

 

OneWay

  データが更新されるとコントロールの値が更新される

  コントロールが値を変えてもデータは更新されない

 

OneWayToSource

  コントロールが値を更新するとデータが更新される

  データを更新してもコントロールは更新されない

 

TwoWay

  データが更新されるとコントロールの値が更新される

  コントロールが値を更新するとデータが更新される

 

 

※OneWayおよびTwoWayを正しく動作させるにはデータがINotifyPropertyChangedを実装している必要がある

 

 

 

明示的に指定しなければDefaultになるが、自作コントロールであればDefault時の動作を正しく制御しておきたい。

モードのDefaultは依存関係プロパティのPropertyMetadataから設定する事が出来る。 

        public static readonly DependencyProperty SelectedColorProperty =
            DependencyProperty.Register(
                "SelectedColor", // プロパティ名を指定
                typeof(Color), // プロパティの型を指定
                typeof(ColorPicker), // プロパティを所有する型を指定
                new FrameworkPropertyMetadata(Colors.White,
                    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    (d, e) => {(d as ColorPicker).OnColorPropertyChanged(e); }));

上記のようにFrameworkPropertyMetadataクラスでメタデータを作成し、

オプションにFrameworkPropertyMetadataOptions.BindsTwoWayByDefaultフラグを立てると

DefaltがTwoWayとして動作するプロパティを作成する事が出来る。