その6:http://blogs.wankuma.com/kazuki/archive/2008/03/02/125877.aspx
DependencyObject関連のことを書いてたのは、ほぼ1年前かぁ。結構昔でびっくりした。
さて、今回は、プロパティの変更時に任意の処理を実行する方法について書こうと思う。
DependencyObjectを定義する側での、プロパティの変更時の処理の書き方は、その2で書いています。
今回は、DependencyObjecを使う側の立場の人がプロパティの変更時の処理を書く方法をやります。
まず、DepObjEduという名前でコンソールアプリケーションを作ります。そして、PresentationCore, PresentationFramework, WindowsBaseの3つを参照に追加します。
次に、Program.csの中に以下のようなクラスを定義します。
いつもどおりのPersonクラスでDependencyPropertyのNameを持ってるだけのシンプル構造です。
public class Person : DependencyObject
{
// デフォルト値がnullのNameプロパティ
public static readonly DependencyProperty NameProperty =
DependencyProperty.Register("Name", typeof(string), typeof(Person), new UIPropertyMetadata(null));
public string Name
{
get { return (string)GetValue(NameProperty); }
set { SetValue(NameProperty, value); }
}
}
こいつのインスタンスを作って、Nameプロパティが変更されるたびに、名前変えましたね?と表示するアプリケーションを作ってみようと思う。
プロパティが変更されたときの処理を書くためには、System.ComponentModel.DependencyPropertyDescriptorクラスを使う。使い方は以下のような感じになる。
static void Main(string[] args)
{
var p = new Person();
// DependencyPropertyDescriptorを取得
var desc = DependencyPropertyDescriptor.FromProperty(Person.NameProperty, typeof(Person));
// インスタンス変数pのNameプロパティが変更したときに呼び出される処理を登録
desc.AddValueChanged(p, (sender, e) => Console.WriteLine("改名しましたね?"));
p.Name = "ほげ"; // 改名しましたね?が表示される
p.Name = "もげ"; // 改名しましたね?が表示される
p.Name = "もげ"; // 値が変わってないので何も表示されない
}
DependencyPropertyDescriptor.FromPropertyでDependencyPropertyDescriptorのインスタンスを取得する。
メソッドの引数には、DependencyPropertyのインスタンスと、オーナー?の型を指定する。
そして、取得したDependencyProeprtyDescriptorのAddValueChangedにデリゲートを渡すと登録完了。
Nameプロパティの値を変更すると、改名しましたね?と表示される。
PropertyChangedイベントがすんなりあったほうが嬉しかった気もする今日この頃でした。
(これはこれで、PropertyChanged系よりいい所もあるけど)