【问题标题】:Property change notification when property members change属性成员更改时的属性更改通知
【发布时间】:2015-08-12 20:44:34
【问题描述】:

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

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

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

this.Location.Offset(10,10);

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

【问题讨论】:

  • DepedencyProperties 不属于 ViewModel。
  • 也就是说,Pointstruct。你不能只是改变它的价值观并期待任何东西。将整个 Point 替换为新的 Point
  • @dotNET 你不应该在视图模型中使用依赖属性。没有理由这样做。改为实现 INotifyPropertyChanged。
  • @Clemens: 嗯...实际上我没有在我的虚拟机中使用DependencyProperty。这些只是普通属性,带有 MVVM Light 的 ObservableObjectRaisePropertyChanged 设置。但是手头的问题仍然没有解决;我的普通属性是Point 类型,我无法知道是否有人为Point 结构的成员赋值。

标签: c# wpf mvvm inotifypropertychanged


【解决方案1】:

根本问题是Point 是可变的。

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

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

【讨论】:

    【解决方案2】:

    在 MVVM 领域,您的 ViewModel 负责在属性更改时通知 View。大多数.NET 类本身不实现INotifyPropertyChanged,因此在使用它们时不会自动连接。每次修改 Location 的任何属性时,您都必须自己在 Location 属性上提高 PropertyChanged

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

    【讨论】:

    • 每次修改 Location 的任何属性时,您都必须自己在 Location 属性上引发 PropertyChanged。 我该怎么做?意思是什么告诉我 Point 结构中的属性是否发生了变化(当然,除非我实现了自己的 Point)?
    • @dotNET 这意味着您要么编写自己的跟踪更改的类的实现,要么手动检查代码库并找到属性被修改的任何地方并添加代码来处理提升属性更改事件。希望清楚哪种方法是首选。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多