代码之家  ›  专栏  ›  技术社区  ›  dotNET

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

  •  0
  • dotNET  · 技术社区  · 9 年前

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

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

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

    this.Location.Offset(10,10);
    

    我的视图不更新,意味着 地方 属性不会将更改通知给视图。为什么会这样?内置类型(如 指向 Size 处理变更通知?

    3 回复  |  直到 9 年前
        1
  •  0
  •   Colin Grealy    9 年前

    根本问题是 Point 是可变的。

    你可以自己写 ImmutablePoint 它允许与现有Point类之间的转换,以实现API兼容性,但不允许使用以下方法 Offset .

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

        2
  •  0
  •   Tyler Lee    9 年前

    在MVVM区域中,ViewModel负责在属性更改时通知View。大多数.NET类都没有实现 INotifyPropertyChanged 这样在使用它们时就不会自动布线。你必须提高 PropertyChanged 你自己 Location 属性 地方

    或者,您可以实现自己的 Point 实现的对象 INotifyPropertyChanged(通知属性已更改) .

        3
  •  0
  •   Mark Feldman    9 年前

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