问题 INotifyPropertyChanging和验证:我什么时候提出PropertyChanging?


INotifyPropertyChanged是相当自我解释的,我想我很清楚何时提出那个(即我已经完成更新值)。
如果我实现了INotifyPropertyChanging,我会在进入setter或其他更改对象状态的方法后立即引发事件,然后继续执行可能发生的任何保护和验证。

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

如果对象的使用者正在使用这个属性(就像让我们说LINQ to SQL使用事件进行更改跟踪)我是否应该暂停并且只有在我验证了我给出的值是好的并且对象的状态对更改有效吗?

这次活动的合同是什么,订户会有什么副作用?


13037
2017-10-04 05:53


起源



答案:


如果您的对象被赋予一个对该属性无效的值,并且您抛出异常,那么您不应该提出 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");
    }
 }

13
2017-10-04 06:07



当你在DLINQ上工作时会看到它(它会被称为那么正确吗?)我想这是相当权威的。你可以指点我的参考吗? - Hamish Smith
DLINQ由开发人员部门(包括Visual Studio团队)开发。 ADO.NET团队创建了LINQ to DataSet和LINQ to Entities。有一个参考 msdn.microsoft.com/en-us/library/... - Mark Cidade
我有所纠正。谢谢。 - Hamish Smith


答案:


如果您的对象被赋予一个对该属性无效的值,并且您抛出异常,那么您不应该提出 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");
    }
 }

13
2017-10-04 06:07



当你在DLINQ上工作时会看到它(它会被称为那么正确吗?)我想这是相当权威的。你可以指点我的参考吗? - Hamish Smith
DLINQ由开发人员部门(包括Visual Studio团队)开发。 ADO.NET团队创建了LINQ to DataSet和LINQ to Entities。有一个参考 msdn.microsoft.com/en-us/library/... - Mark Cidade
我有所纠正。谢谢。 - Hamish Smith


作为旁白 - PostSharp 有自动实现INotifyPropertyChanged的有趣能力 - 像这样


1
2017-10-04 08:56



那很有意思。我一直在使用一个代码片段(并且有一个基本类实际上保存事件并引发它)但它确实似乎迫不及待成为别人的问题。 - Hamish Smith
另外,这也可以通过一些相当有趣的DI / IOC魔法“自动实现” - 看到这里 (我不是卖这个,但如果没别的话,它会有趣的教学阅读) - fostandy


如果您想完全避免实现INotifyPropertyChanged,请考虑使用 更新控制.NET 代替。这消除了几乎所有的簿记代码。


0
2017-12-30 13:02