Expressionを使ってプロパティ名を文字列ではなくてラムダ式で与える方法
久しぶりに、目から鱗ものでした。
これを使うとタイプセーフにPropertyChangedイベントが発行できます。
下のようなViewModelBaseクラスと、その拡張メソッドを定義します。
public class ViewModelBase : INotifyPropertyChanged
{
#region INotifyPropertyChanged メンバ
public event PropertyChangedEventHandler PropertyChanged;
public virtual void OnPropertyChanged(string name)
{
var h = PropertyChanged;
if (h == null)
{
return;
}
h(this, new PropertyChangedEventArgs(name));
}
#endregion
}
public static class ViewModelEx
{
public static void OnPropertyChanged<TObj, TProp>(this TObj self, Expression<Func<TObj, TProp>> e)
where TObj : ViewModelBase
{
var name = ((MemberExpression)e.Body).Member.Name;
self.OnPropertyChanged(name);
}
}
んで、ViewModelBaseを継承した先で、下のようにやれば文字列指定でOnPropertyChangedを呼び出す必要がなくなります。
public class MainViewModel : ViewModelBase
{
public string _text;
public string Text
{
get { return _text; }
set
{
_text = value;
// 拡張メソッドなのでthisがいる(タイプセーフ万歳)
this.OnPropertyChanged(o => o.Text);
}
}
}
う~ん。うれしいかな・・・?