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 }