変更通知機能、その弐

変更通知機能で書いたけど、自前の依存関係プロパティや、添付プロパティに関する変更検知は、比較的簡単に実装できる。
では、既存の依存関係プロパティの変更検知はどうするんだろ?と思った。
それを目的に調査はしていないけど、開発の過程で分かった事をメモしておく。
1:XAMLのトリガーで検出する。
 Style.TriggersのTriggerで、依存関係プロパティの変更を検出して、どうこうするということはできる。他のプロパティ値の値を変えたりするときに便利。XAML内で完結するところが良い。ただ、他のコントロールが持つプロパティ値への干渉は難しい。

2:変更検知したいコントロールを継承する。
 継承すると、もれなくprotectedでvirtualなメソッドをオーバーライドできる。
    /// <summary>
/// 変更検知したいが為の継承。
/// </summary>
public class ComboBoxEx : ComboBox {

/// <summary>
/// プロパティ値変更イベント用メソッド
/// </summary>
/// <param name="e">イベント引数</param>
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) {
if (e.OldValue != null) {
//...
}

if (e.NewValue != null) {
//...
}

switch (e.Property.Name) {
case "DataContext":
//...
break;
}

base.OnPropertyChanged(e);
}
}
NewValueとOldValueで、新旧の値がわかるのが良い。
でも、コレの為だけにすべてのコントロールを継承する事が正直微妙。

3.DependencyPropertyDescriptorを使う。
System.ComponentModelにある、DependencyPropertyDescriptorクラスを使う。このクラスは依存関係プロパティ専用。通常のプロパティ(CLRプロパティ)には、PropertyDescriptorクラスがある。これを使って、一応変更検知をすることはできる。
//本来は、XAML上にある実体を確保したりする筈です。
ComboBox comboBox = new ComboBox();
//依存関係プロパティ特性を取得します。
var descriptor = DependencyPropertyDescriptor.FromProperty(
ComboBox.DataContextProperty, typeof(ComboBox));
descriptor.AddValueChanged(comboBox,
(sender, e) => {
//とりあえず、DataContextが変更されたら、ここに来ます。
var cmbo = sender = sender as ComboBox;
});
前の値というのはわからないが、とりあえず、変更後の値は確保できる。
旧の値を使いたい時は、難しいけど、特定の依存関係プロパティの変更検知をしたい時は便利かな。
なお、上記の実装では、高確率でリークするので、終了時に、対のメソッドとなるRemoveValueChangedで、メソッドをイベントから削除しておく必要がある。こういう手作業の多さが、この方法のデメリットでもあるかも。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m