11

INotifyPropertyChanged 是相当不言自明的,我想我很清楚何时提高那个(即当我完成更新值时)。
如果我实现 INotifyPropertyChanging,我倾向于在进入更改对象状态的设置器或其他方法后立即引发事件,然后继续进行可能发生的任何防护和验证。

因此,我将此事件视为属性可能更改但尚未更改的通知,并且可能实际上并未成功完成更改。

如果对象的使用者正在使用此属性(例如,假设 LINQ to SQL 使用事件进行更改跟踪),我是否应该推迟并仅在我确认我得到的值是好的并且只引发事件时对象的状态是否对更改有效?

此事件的合同是什么,订阅者会有什么副作用?

4

3 回答 3

13

如果您的对象被赋予对该属性无效的值并且您抛出异常,那么您不应该引发该PropertyChanging事件。仅当您决定该值更改时,才应引发该事件。典型的使用场景是改变一个简单的字段:

public T Foo
 { get
    { return m_Foo;
    }
   set
    { if (m_Foo == value) return; //no need for change (or notification)
      OnPropertyChanging("Foo");
      m_Foo = value;
      OnPropertyChanged("Foo");
    }
 }
于 2008-10-04T06:07:37.570 回答
1

顺便说一句- PostSharp具有自动实现 INotifyPropertyChanged 的​​有趣能力 -就像这样

于 2008-10-04T08:56:08.900 回答
0

如果您想完全避免实现 INotifyPropertyChanged,请考虑改用Update Controls .NET。这消除了几乎所有的簿记代码。

于 2008-12-30T13:02:10.250 回答