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);
}