WPF MVVM模式开发实现简明教程 2 初识 INotifyPropertyChanged
WPF MVVM模式开发实现简明教程 3-1 BaseCommand
WPF MVVM模式开发实现简明教程 4 ViewModelBase
WPF MVVM模式开发简明实现教程 5 使用MultiValueConverter进行多参数事件绑定
WPF MVVM模式开发简明实现教程 7 DevExpress MVVM
如果多个ViewModel,则每个都要继承INotifyPropertyChanged,并且有如下相同的方法
public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
ViewModelBase 就是为了简化以上代码而出现的
版本1
直接把之前的代码放到一个类里,
调用时
public class ButtonViewModel : ViewModelBase
ViewModelBase 代码
using System.ComponentModel; using System.Runtime.CompilerServices; public abstract class ViewModelBase : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
}
属性
private string buttonContent; public string ButtonContent { get { return buttonContent; } set { buttonContent = value; OnPropertyChanged("ButtonContent"); } }
版本2
优化,不用传propertyName 了
using System.ComponentModel; using System.Runtime.CompilerServices; public abstract class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
属性
private string buttonContent; public string ButtonContent { get { return buttonContent; } set { buttonContent = value; OnPropertyChanged(); } }
版本3
增加
protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = "") { if (EqualityComparer<T>.Default.Equals(storage, value)) return false; storage = value; this.OnPropertyChanged(propertyName); return true; }
属性
private string buttonContent; public string ButtonContent { get { return buttonContent; } set { SetProperty(ref buttonContent, value); }
}
进一步简化代码
还有更简化的,可以参考后面的DevExpress版本的,当然也可以自己实现