我正在学习MVVM,试图找到一种方法来显示经过计算得出的属性随着它所依赖的属性值的改变而改变的过程。目前为止,所有我看到的解决方案都严重违反了封装性原则,我想知道是否有更好的方法。
假设我需要显示的其中一件事情是复杂税务计算的结果。这个计算(以及可能涉及到的依赖项)会不时地发生改变,因此我希望能够将其严格封装起来。
这里最常提供的解决方案似乎是让所有影响税值的属性在 ModelView 中调用 PropertyChanged 事件,包括当前属性本身以及所有依赖于它的属性。这意味着每个属性都需要知道使用它或可能使用它的所有内容。当我的税务规则以一种使计算依赖于以前没有依赖的内容的方式发生变化时,我将需要触及所有那些进入我的计算的新属性(可能在其他类中,可能不在我控制之下),以使它们调用PropertyChanged来更新税值。这完全破坏了任何封装的希望。
我能想到的最好的解决方案是使执行计算的类接受 PropertyChanged 事件,并在涉及到计算的任何内容发生变化时引发一个新的 PropertyChanged 事件,以更新税值。这至少保留了类级别的封装性,但仍然打破了方法级别的封装性:类不应该知道方法如何完成其工作。
所以,我的问题是,是否有更好的方法(如果有,是什么)?或者说,表现封装(MVVM)是否防止业务逻辑的封装?我面临着二选一的选择吗?