属性 属性 成员变更时的变更通知
Property change notification when property members change
假设我的 ViewModel 中有一个名为 Location
且类型为 Point
的 属性,我的视图将绑定到该模型。我正在使用 MVVM Light 的 ObservableObject
和 RaisePropertyChanged
设置来引发 属性 更改通知。问题是当我在 ViewModel 中执行以下命令时:
this.Location = new Point(100,100);
我的视图更新正确。但如果我这样做:
this.Location.Offset(10,10);
我的视图没有更新,意味着 Location
属性 没有通知视图有关更改。为什么会这样? Point
或Size
等内置类型的子属性如何处理变更通知?
在 MVVM 领域,您的 ViewModel 负责在属性更改时通知 View。大多数 .NET 类 本身并未实现 INotifyPropertyChanged
,因此您在使用它们时不会获得自动连接。每次修改 Location
的任何属性时,您都必须在 Location
属性 上提高 PropertyChanged
或者,您可以实现自己的 Point
对象,该对象实现 INotifyPropertyChanged
.
您可以使用 Castle Dynamic Proxy(在运行时将模型包装在代理中)或 PropertyChanged.Fody(在编译时修改模型的 IL)自动将 INotifyPropertyChanged 添加到您的 class 成员. Google 是你的朋友。
根本问题是 Point
是可变的。
您可以编写自己的 ImmutablePoint
,允许与现有点 class 相互转换以实现 API 兼容性,但不允许 Offset
等方法。
这不是一个理想的解决方案,但它解决了更改 属性 上的字段而不是 属性 本身的问题。
假设我的 ViewModel 中有一个名为 Location
且类型为 Point
的 属性,我的视图将绑定到该模型。我正在使用 MVVM Light 的 ObservableObject
和 RaisePropertyChanged
设置来引发 属性 更改通知。问题是当我在 ViewModel 中执行以下命令时:
this.Location = new Point(100,100);
我的视图更新正确。但如果我这样做:
this.Location.Offset(10,10);
我的视图没有更新,意味着 Location
属性 没有通知视图有关更改。为什么会这样? Point
或Size
等内置类型的子属性如何处理变更通知?
在 MVVM 领域,您的 ViewModel 负责在属性更改时通知 View。大多数 .NET 类 本身并未实现 INotifyPropertyChanged
,因此您在使用它们时不会获得自动连接。每次修改 Location
Location
属性 上提高 PropertyChanged
或者,您可以实现自己的 Point
对象,该对象实现 INotifyPropertyChanged
.
您可以使用 Castle Dynamic Proxy(在运行时将模型包装在代理中)或 PropertyChanged.Fody(在编译时修改模型的 IL)自动将 INotifyPropertyChanged 添加到您的 class 成员. Google 是你的朋友。
根本问题是 Point
是可变的。
您可以编写自己的 ImmutablePoint
,允许与现有点 class 相互转换以实现 API 兼容性,但不允许 Offset
等方法。
这不是一个理想的解决方案,但它解决了更改 属性 上的字段而不是 属性 本身的问题。