首先感嘆一下,INotifyPropertyChanged這個單詞有點長,我現在都還記不住……
其次再感嘆一下,實現這個接口,屬性的封裝還是有點麻煩啊。
屬性什么的我就喜歡 xxx{get;set;}……不得不說我是一個很懶的猿~
首先來看看一般的實現方式:

public class NotificationObject : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; /// <summary> /// 實現依賴屬性 /// </summary> /// <param name="propertyName"></param> public void RaisePropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } private string _userName; //private const string UserNameProperty="UserName"; public string UserName { get { return _userName; } set { _userName= value; this.RaisePropertyChanged("UserName");//這樣的寫法是不是很不爽? 或者this.RaisePropertyChanged(UserNameProperty) } } }
對於以上的寫法,實在有點不爽,不寫const字段吧,比較容易填錯,寫了吧,哎呀好費事兒啊。
很幸運的是不僅是我覺得麻煩,有大神已經給出了解決之道:(很抱歉,忘記是哪位大神的文章了,剛剛翻了一下沒找到,這里就直接上代碼了)

public static class NotificationObjectEx { /// <summary> /// 使用:RaisePropertyChanged(vm=>vm.屬性) /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="TProperty"></typeparam> /// <param name="propertyChangedBase"></param> /// <param name="expression"></param> public static void RaisePropertyChanged<T, TProperty>(this T propertyChangedBase, Expression<Func<T, TProperty>> expression) where T : NotificationObject { var memberExpression = expression.Body as MemberExpression; if (memberExpression != null) { string propertyName = memberExpression.Member.Name; propertyChangedBase.RaisePropertyChanged(propertyName); } else throw new NotImplementedException(); } }
於是就可以這樣:this.RaisePropertyChanged(vm=>vm.UserName); 是不是覺得爽多了?麻麻再也不用擔心哦拼錯屬性名稱了~
最后,好記性不如爛筆頭~~INotifyPropertyChanged、INotifyPropertyChanged、INotifyPropertyChanged、INotifyPropertyChanged、INotifyPropertyChanged……