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



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

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

my View更新正确。但是如果我这样做:

this.Location.Offset(10,10);

我的视图不更新,意味着Location属性不通知视图的变化。为什么会这样呢?内置类型(如PointSize)的子属性如何处理更改通知?

根本问题是Point是可变的。

您可以编写自己的ImmutablePoint,允许从现有的Point类转换到API兼容性,但不允许像Offset这样的方法。

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

在MVVM中,你的ViewModel负责在属性改变时通知View。大多数。net类本身不实现INotifyPropertyChanged,所以在使用它们时不会自动连接。每次修改Location

的任何属性时,都必须在Location属性上触发PropertyChanged

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

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

相关内容

  • 没有找到相关文章

最新更新