我正在WPF项目中的一些视图模型上实现INotifyPropertyChanged
。为此,我需要始终声明INotifyPropertyChanged
特定代码,如下例所示:
class ViewModel : INotifyPropertyChanged
{
private bool _property;
public event PropertyChangedEventHandler PropertyChanged;
public bool Property
{
get { return _property; }
set
{
_property = value;
OnPropertyChanged("Property");
}
}
protected virtual void OnPropertyChanged(string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
ViewModel
专用的唯一代码是Property
,而其他代码似乎只是噪音。我试图减少它,考虑到我不只有一个视图模型,并且将来会增加更多,通过这种方式在视图模型和INotifyPropertyChanged
接口之间添加一个抽象类:
public abstract class NotifiableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
现在所有的视图模型都变短了,例如:
class ViewModel : NotifiableObject
{
private bool _property;
public bool Property
{
get { return _property; }
set
{
_property = value;
NotifyPropertyChanged(nameof(Property));
}
}
}
现在对于我要添加的每个属性,我将无法使用自动属性,但是我必须保留一个支持的字段并始终在setter上,我将不得不调用NotifyPropertyChanged
方法。我正在寻找一种方法来避免这种情况,并进一步减少我的代码:
class ViewModel : NotifiableObject
{
[NotifiableProperty]
public bool Property { get; set; }
}
我不是特别关注自it has been asked before以来与WPF或related to C# in general相关的属性,而是以任何方式解决此问题。
我知道代码现在更短了,但将来这会对应用程序的可读性产生很大影响。任何改进建议都表示赞赏。
谢谢!