【问题标题】:Why is INotifyPropertyChanged in both Model and ViewModel?为什么 INotifyPropertyChanged 在 Model 和 ViewModel 中都有?
【发布时间】:2015-07-28 18:55:12
【问题描述】:

我遇到的几乎每个 MVVM 示例都有实现 INotifyPropertyChanged 的​​模型和视图模型。

其他来源(专注于领域建模的来源)似乎表明模型应该非常简单(与关注点分离有关?)基本上没有任何参考。不幸的是,这些来源不使用 MVVM。

我正在尝试调和两者。

-我对编程比较陌生,对设计模式等完全陌生,所以请尽量放轻松。

编辑:让我重新表述我的问题。鉴于上述问题的答案似乎是“有时一个,有时另一个”,何时你应该做一个,什么时候应该做另一个。另外,每个将如何实现?

(在另一篇文章中没有回答。只是让他们互相争吵)。

【问题讨论】:

  • INotifyPropertyChanged (.NET 2+) 早于 WPF (.NET 3+),因此在这方面设计模式早于 MVVM。在任何你想使用的地方使用INotifyPropertyChanged
  • 方便。 INDEI 也是如此。如果你不这样做,你最终不得不来回映射类型(什么是 PITA)或者为你的模型创建一个支持 INPC 的包装器。

标签: c# wpf mvvm


【解决方案1】:

我不知道这是否是最佳实践,但我设置了 ViewModel,使其成为唯一的活动实体。只有在通过从数据库读取(然后加载到 ViewModel)创建模型时,或者在保存到数据库之前(从 ViewModel 中提取,修改仅与数据库相关的模型属性,如外键),才能直接更改模型。

如果出于某种原因您希望能够将多个 ViewModel 连接到同一个模型,或者需要从 ViewModel 下更改模型,那么您有充分的理由在模型上实现 INotifyPropertyChanged

我是一个相对业余的人,所以我说的话持保留态度。但这就是我一直在收集的内容,并且我认为强制执行这种分离使我的代码更清晰,更易于理解和调试。所以对于我自己的项目,如果可以的话,我会尽量避免在我的模型上实现INotifyPropertyChanged

【讨论】:

    【解决方案2】:

    模型必须实现INotifyPropertyChanged 以通知视图模型它们已更改。如果模型没有实现INotifyPropertyChanged(或其他等效接口),则视图模型会使用轮询或其他类似低效的方法来检测模型状态的变化。

    This MSDN page 可能有助于进一步了解构成 MVVM 模式的各种组件的角色。

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 2010-10-20
      • 2011-09-25
      • 1970-01-01
      • 2019-09-25
      • 2018-02-19
      • 2021-09-20
      • 2023-04-02
      • 2010-10-27
      相关资源
      最近更新 更多