视频图像处理系列索引 || Arcgis/Engine/Server开发索引 || Web Map Gis开发索引 || jquery表格组件 JQGrid索引
WPF MVVM模式开发实现简明教程索引 || ArcGIS Runtime WPF(.net C#)开发简明教程索引

WPF MVVM模式开发实现简明教程 4 ViewModelBase

WPF MVVM模式开发实现简明教程 1 开篇简介 

WPF MVVM模式开发实现简明教程 2 初识 INotifyPropertyChanged

WPF MVVM模式开发简明实现教程 3 事件绑定   

WPF MVVM模式开发实现简明教程 3-1 BaseCommand  

WPF MVVM模式开发实现简明教程 4 ViewModelBase  

WPF MVVM模式开发简明实现教程 5 使用MultiValueConverter进行多参数事件绑定 

WPF MVVM模式开发简明实现教程 6 其他绑定  

WPF MVVM模式开发简明实现教程 7 DevExpress MVVM  

WPF MVVM模式开发简明实现教程 8 完结 附全部代码  

 

如果多个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版本的,当然也可以自己实现

posted @ 2020-12-17 12:15  jhlong  阅读(1074)  评论(0编辑  收藏  举报
海龙的博客 jhlong@cnblogs 版权所有© 转载请注明链接.有用请推荐一下
代码全部经过本人测试,但不保证复制粘贴就正常运行,更不保证能解决你的问题,请结合前后代码及描述理解后修改和使用