调用INotifyPropertyChanged的PropertyChanged事件的最佳方法是什么?

实现INotifyPropertyChanged接口时,每次在类中更新属性时,您都要负责调用PropertyChanged事件。

这通常会导致以下代码:

public class MyClass: INotifyPropertyChanged private bool myfield; public bool MyField { get { return myfield; } set { if (myfield == value) return; myfield = value; OnPropertyChanged(new PropertyChangedEventArgs("MyField")); } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(PropertyChangedEventArgs e) { PropertyChangedEventHandler h = PropertyChanged; if (h != null) h(this, e); } } 

这是每个属性12行

如果一个人能够装饰这样的自动属性会简单得多:

 [INotifyProperty] public double MyField{ get; set; } 

但不幸的是,这是不可能的(例如,请参阅msdn上的这篇文章 )

如何减少每个属性所需的代码量?

实际上, 每个属性只有3-4行; 其他行在所有“通知”属性上摊销

 class Person : INotifyPropertyChanged { #region INotifyPropertyChanged: Shared bit public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(PropertyChangedEventArgs e) { if (PropertyChanged != null) PropertyChanged(this, e); } #endregion private string _firstName; public string FirstName { get { return _firstName; } set { if (_firstName == value) return; _firstName = value; OnPropertyChanged(new PropertyChangedEventArgs("FirstName")); } } // Ditto for other properties } 

你可以尝试类似下面的东西,它分享更多的负载:

 private string _firstName; public string FirstName { get { return _firstName; } set { SetNotifyingProperty("FirstName", ref _firstName, value); } } private void SetNotifyingProperty(string propertyName, ref T field, T value) { if (value.Equals(field)) return; field = value; OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } 

我现在要做的是我在课堂上写这个:

  //AUTOGENERATE INotifyProperty private bool myfield; 

我编写了一个小工具,可以在分部类中生成所有需要的属性代码。 这绝不是一个优雅的解决方案,但它的工作原理:)