跳转至

MVVM模式中Modelbase的写法

版本 1

定义:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class ModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string property)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
    }
}

写法示例:

private bool _isExpanded;
public bool IsExpanded
{
    get => _isExpanded;
    set
    {
        if (value != _isExpanded)
        {
            _isExpanded = value;
            RaisePropertyChanged(nameof(IsExpanded));
        }
    }
}

优化版 2(不用传 PropertyName)

定义:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class ModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged([CallerMemberName] string property = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
    }
}

写法示例:

private string buttonContent;

public string ButtonContent
{
    get { return buttonContent; }
    set
    {
        buttonContent = value;
        OnPropertyChanged();
    }
}

版本 3(新增 SetProperty,使代码更简化)

定义

public class ModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }

    protected virtual bool SetProperty<T>(ref T storage,T value,[System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
    {
        if (EqualityComparer<T>.Default.Equals(storage, value))
        {
            return false;
        }
        storage = value;
        this.RaisePropertyChanged(propertyName);
        return true;
    }
}

写法示例:

private string buttonContent;
public string ButtonContent
{
    get => buttonContent;
    set => SetProperty(ref buttonContent, value);
}

评论