REVIEW(12/04/19)
“INotifyPropertyChanged”実装を支援するVS拡張機能「Notify Property Weaver」
導入するだけで煩雑な“INotifyPropertyChanged”の実装が不要に
「Notify Property Weaver」は、“INotifyPropertyChanged”インターフェイスの実装を支援する「Visual Studio」用の拡張機能。「Visual Studio 2010」に対応するフリーソフトで、編集部にてWindows 7上の「Visual Studio 2010 Professional」で動作を確認した。ライブラリサイト“Visual Studio Gallery”からダウンロードできる。
WPF/Silverlightなどでは、“データバインディング”という仕組みが標準で用意されている。この仕組を利用すれば、ビュー(ユーザーインターフェース)へオブジェクトをバインド(紐付け)して、当該オブジェクトの内容変更を自動的にビューへ反映できるほか、逆にビューへの入力をオブジェクトへ反映させることも可能。見た目と機能を分離できるので、再利用性が向上したり、設計を簡素に保つことができるほか、テストが容易になるなどの効果も期待できる。
“データバインディング”を利用するには、ビューへプロパティの変更を通知するためのインターフェイス“INotifyPropertyChanged”を、バインドするオブジェクトが実装している必要がある。たとえば、以下のコードがあるとする。
public class Person { public string GivenNames { get; set; } // 名 public string FamilyName { get; set; } // 姓 public string FullName { // 氏名 get { return string.Format("{0} {1}", GivenNames, FamilyName); } } }
これに“INotifyPropertyChanged”インターフェイスを実装すると、以下のようなコードになる。
public class Person : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; string givenNames; public string GivenNames // 名 { get { return givenNames; } set { if (value != givenNames) { givenNames = value; OnPropertyChanged("GivenNames"); // 名が変わった OnPropertyChanged("FullName"); // 氏名が変わった } } } string familyName; public string FamilyName // 姓 { get { return familyName; } set { if (value != familyName) { familyName = value; OnPropertyChanged("FamilyName"); // 姓が変わった OnPropertyChanged("FullName"); // 氏名が変わった } } } public string FullName // 氏名 { get { return string.Format("{0} {1}", GivenNames, FamilyName); } } // プロパティが変更されたことを通知するイベントを発行 public virtual void OnPropertyChanged(string propertyName) { var propertyChanged = PropertyChanged; if (propertyChanged != null) { propertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
このようにソースコードが非常に煩雑になる上、プロパティの変更通知がプロパティ名(string型)でやり取りされるためIDEのコード補完機能が利用できないため、ミスタイプを誘発することも少なくない。
そこで便利なのが「Notify Property Weaver」だ。本拡張機能は、中間言語(IL)へコンパイルされたコードを分析し、ビルド時にプロパティの変更通知を行うコードを注入(Weave:織り込む)する。そのため、煩雑な“INotifyPropertyChanged”の実装が不要になり、プログラマーはそれ以外の要素の設計と実装に注力できるようになる。
ちなみに、「Notify Property Weaver」を利用した場合、上記のコードは以下のように簡略化することが可能。
public class Person: INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;public string GivenNames { get; set; } // 名 public string FamilyName { get; set; } // 姓 public string FullName { // 氏名 get { return string.Format("{0} {1}", GivenNames, FamilyName); } } }
“名”や“姓”の変更にともなう“氏名”の変化も、「Notify Property Weaver」が検知してコードを自動挿入してくれるため、正常にビューへ反映される。
なお作者によると、.NET Framework 3.5/4/4.5、Silverlight 3/4/5(Windows Phone 7を含む)で動作を確認しているとのこと。
- 【著作権者】
- Simon Cropp 氏
- 【対応OS】
- (編集部にてWindows 7で動作確認)
- 【ソフト種別】
- フリーソフト
- 【バージョン】
- 1.42.0.0(12/04/09)