属性 属性 成员变更时的变更通知

Property change notification when property members change

假设我的 ViewModel 中有一个名为 Location 且类型为 Point 的 属性,我的视图将绑定到该模型。我正在使用 MVVM Light 的 ObservableObjectRaisePropertyChanged 设置来引发 属性 更改通知。问题是当我在 ViewModel 中执行以下命令时:

this.Location = new Point(100,100);

我的视图更新正确。但如果我这样做:

this.Location.Offset(10,10);

我的视图没有更新,意味着 Location 属性 没有通知视图有关更改。为什么会这样? PointSize等内置类型的子属性如何处理变更通知?

在 MVVM 领域,您的 ViewModel 负责在属性更改时通知 View。大多数 .NET 类 本身并未实现 INotifyPropertyChanged,因此您在使用它们时不会获得自动连接。每次修改 Location

的任何属性时,您都必须在 Location 属性 上提高 PropertyChanged

或者,您可以实现自己的 Point 对象,该对象实现 INotifyPropertyChanged.

您可以使用 Castle Dynamic Proxy(在运行时将模型包装在代理中)或 PropertyChanged.Fody(在编译时修改模型的 IL)自动将 INotifyPropertyChanged 添加到您的 class 成员. Google 是你的朋友。

根本问题是 Point 是可变的。

您可以编写自己的 ImmutablePoint,允许与现有点 class 相互转换以实现 API 兼容性,但不允许 Offset 等方法。

这不是一个理想的解决方案,但它解决了更改 属性 上的字段而不是 属性 本身的问题。