MVVM更新计算的属性

dig*_*tig 9 c# wpf mvvm

我只是在学习MVVM,而我正在努力研究如何根据计算出来的值的变化来显示对计算属性的更改.到目前为止,我看到的所有解决方案都严重违反了封装,我想知道是否有更好的解决方案.

假设我需要显示的一件事是复杂税收计算的结果.计算(可能还有它的依赖关系)会不时改变,所以我想保持严格的封装.

这里最常提供的解决方案似乎是获取税值所依赖的所有属性,以便在ModelView中为属性本身以及依赖于它的每个属性调用PropertyChanged .这意味着每个属性都需要知道使用或可能使用它的所有内容.当我的税收规则以一种使计算依赖于以前不依赖的事物的方式改变时,我将需要触及所有进入我计算的新属性(可能在其他类中,可能不在我的控制之下),让他们为税值调用PropertyChanged.这完全破坏了封装的任何希望.

我能想到的最佳解决方案是让进行计算的类接收 PropertyChanged事件,并在计算中发生任何更改时为税值引发新的PropertyChanged事件.这至少保留了级别的封装,但它仍然违反了方法封装:类不应该知道方法如何工作.

所以,我的问题是,是否有更好的方法(如果是的话,它是什么)?或者表示封装(MVVM)是否阻止了业务逻辑的封装?我是否面临任何一种选择?

小智 3

这里最常提供的解决方案似乎是获取税值所依赖的所有属性,以便在 ModelView 中为属性本身以及依赖于它的每个属性调用 PropertyChanged。....

是的,但仅适用于该对象:每个属性都应在 setter 中触发其自己的属性更改事件。此外,设置器应该以某种方式触发依赖于该值本身的属性。您不应该尝试主动触发其他对象的更新:它们应该监听此对象PropertyChanged

我能想到的最好的解决方案是让执行计算的类接收 PropertyChanged 事件,并在计算中发生任何更改时为税值引发一个新的 PropertyChanged 事件。这至少保留了类级别的封装,但它仍然违反了方法封装:类不必知道方法如何工作。

这确实是标准方式。每个类都有责任监视它所依赖的属性,并为其属性触发属性更改事件。

可能有一些框架可以帮助您完成此操作,但了解应该发生什么是值得的。