【发布时间】:2012-02-20 13:07:37
【问题描述】:
C 类实现 INotifyPropertyChanged。
假设 C 具有 Length、Width 和 Area 属性,其中 Area = Length * Width。任一可能的变化都会导致面积发生变化。这三个都是绑定的,即 UI 期望这三个都通知它们值的变化。
当 Length 或 Width 改变时,它们的 setter 调用 NotifyPropertyChanged。
我应该如何处理计算的 Area 属性?目前我能想到的模式是在 NotifyPropertyChanged 中检测更改的属性是 Length 还是 Width,如果是这种情况,则为 Area 启动附加的 PropertyChanged 通知。然而,这需要我在 NotifyPropertyChanged 内部维护依赖关系图,我认为这是一种反模式。
所以,我的问题是:我应该如何编写依赖于其他依赖属性的依赖属性?
edit:这里的人建议 Length 和 Width 也为 Area 调用 NotifyPropertyChanged。同样,我认为这是一种反模式。属性(恕我直言)不应该知道谁依赖它,NotifyPropertyChanged 也不应该知道。只有属性应该知道它依赖于谁。
【问题讨论】:
-
不要将 dependency properties 与实现 INotifyPropertyChanged 的类的属性混淆。这不是一回事。
-
如果你真的不喜欢它。将您的视图模型注册到它自己的 PropertyChanged 事件,监听 Width 和 Length 的属性更改,然后再次引发 Area 的更改。但同样,提出多个属性是完全有效的。事实上, raise 永远不会调用属性的 setter,只会调用 getter,所以它是安全的。
-
我同意你的看法,@Avi。
Length和Width不应该负责为Area提升PropertyChanged- 如果是,如果这些属性在另一个类中,你会怎么做?我在另一个问题中回答了这个问题:stackoverflow.com/questions/43653750/…