WPFINotifyPropertyChanged使用技巧 public class NotifyPropertyChanged : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; ...
WPFINotifyPropertyChanged使用技巧
public class NotifyPropertyChanged : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void NotifyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }傳統使用方法
這種方式稱之為一般的實現方式, 因為它確實是太普通不過了, 而且使用起來也讓人感到厭惡, 因為必須指定手工指定屬性名稱:如需要實現的屬性過多,
則指定屬性名是非常繁瑣,無聊,容易出錯,並且會使代碼累贅。
於是通過另一種方式減少代碼輸入(本質就是傳遞當前發生改變屬性的名稱):
#region 引髮指定屬性更改事件 /// <summary> /// 引髮指定屬性更改事件 /// </summary> public virtual void RaisePropertyChanged() { /* * 1.取當前調用堆棧的上一個方法(一般為屬性內部的SetMethod) * 2.目前CLR對屬性SetMethod方法的命名規則為“set_” + 屬性名 * 3.只要CLR依舊保持著這個命名規則,我們就可以自動忽略參數了 */ var stack = new StackTrace(); var lastFrame = stack.GetFrame(1); var methodName = lastFrame.GetMethod().Name; var propertyName = methodName.Substring(methodName.LastIndexOf('_') + 1); this.NotifyChanged(propertyName); } #endregion簡單實現方式
/// <summary> /// 實現INotifyPropertyChanged 向客戶端發出某一屬性值已更改的通知 /// </summary> [SerializableAttribute] public class NotifyPropertyChanged : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void NotifyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #region 引髮指定屬性更改事件 /// <summary> /// 引髮指定屬性更改事件 /// </summary> public virtual void RaisePropertyChanged() { /* * 1.取當前調用堆棧的上一個方法(一般為屬性內部的SetMethod) * 2.目前CLR對屬性SetMethod方法的命名規則為“set_” + 屬性名 * 3.只要CLR依舊保持著這個命名規則,我們就可以自動忽略參數了 */ var stack = new StackTrace(); var lastFrame = stack.GetFrame(1); var methodName = lastFrame.GetMethod().Name; var propertyName = methodName.Substring(methodName.LastIndexOf('_') + 1); this.NotifyChanged(propertyName); } #endregion }全部代碼