【问题标题】:How to Update View and View Model without using INotifyPropertyChanged如何在不使用 INotifyPropertyChanged 的​​情况下更新视图和视图模型
【发布时间】:2012-08-27 10:20:04
【问题描述】:

当我们在 View 和 View-Model 之间进行双向绑定时,我们实现 INotifyPropertyChanged 接口,该接口具有以下事件:

// Summary:
//     Occurs when a property value changes.
event PropertyChangedEventHandler PropertyChanged;

但是我可以在不实现 INotifyPropertyChanged 的​​情况下做同样的事情吗?

【问题讨论】:

  • “做同样的事情”可以用几种不同的方式来解释。如果您问“我可以添加一个名为 PropertyChanged 的​​事件处理程序吗”,那么可以!
  • 有什么具体原因不能使用,或者不喜欢使用INotifyPropertyChanged?
  • @Clemens 我也有这个问题。考虑一个第三方库,您希望在其中直接在 WPF 中显示对象。当然,通常您会将这些对象视为模型,并创建一个视图模型。但是,当您使用诸如 PropertyGrid 之类的东西时,这非常困难。我遇到了物理引擎和属性网格的问题。

标签: c# wpf mvvm


【解决方案1】:

如果您无法实现 INotifyPropertyChanged (INPC)(或没有要绑定的源),那么您应该将要绑定的任何内容包装到您的视图模型和视图中模型将为绑定实现 INPC,并且必须将数据获取/设置到可能是其他类。

【讨论】:

    【解决方案2】:

    如果您想避免显式实现INotifyPropertyChanged,您可以使用像 PostSharp 这样的代码编织工具。然后,实现INotifyPropertyChanged 就变得像

    [NotifyPropertyChanged]
    public class Shape
    {
        public double X { get; set; }
        public double Y { get; set; }
    }
    

    您可以在此处找到更多详细信息:http://www.sharpcrafters.com/solutions/notifypropertychanged#

    【讨论】:

      【解决方案3】:

      当然可以。当视图模型更改时,您只需放松更新视图的简单方法。现在有办法克服这一点。

      1. 重新应用DataContext,这样所有绑定都会被评估 再次,但这是非常昂贵的。
      2. 在ui中,获取所需属性的绑定并调用 UpdateTarget

      但显然这些都是非常奇怪的解决方法。还值得一提的是,绑定到不实现 INotifyPropertyChanged 的​​对象通常更慢。

      【讨论】:

        【解决方案4】:

        我会说不。您必须以任何方式实现 INotifyPropertyChanged,否则与 twoway 绑定将不起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-13
          • 1970-01-01
          • 1970-01-01
          • 2020-05-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多