【问题标题】:VMa <- Ma, VMb -> Ma ...Versus... VMa <- VMb -> MaVMa <- Ma, VMb -> Ma ...对比... VMa <- VMb -> Ma
【发布时间】:2011-07-14 21:32:03
【问题描述】:

选项1:ViewModelA ModelA
选项2:ViewModelA ModelA

*ModelA 通过ViewModelB改变它的属性,所以在Option2中它不需要实现任何通知视图模型中的任何人它已更改的机制。
*Option2 需要两个视图模型之间的消息传递解决方案,而 Option1 不需要。

Option1 还是 Option2 哪个更好?

编辑:
我选择实现 Option2,因为我想让 ModelA 类成为一个简单的 POCO。
我还将 ViewModelB 重命名为 ModelViewB

回答:
终于实现了... Option1。这里的诱惑是我可以保持ModelA简单(例如不通知任何人)。但最终它使应用程序复杂化,因为它背离了其他类的实现。最好遵守一条规则(甚至可能有一些开销)。

messenger 类实际上是辅助类,而不是模式的核心成分,所以我使解决方案更接近模式(正如下面的人也提到的)。

【问题讨论】:

  • 你能稍微解释一下你的场景吗?你有两个 GUI,一个会改变模型,另一个不会?
  • @jpsstavares 没错。两个 GUI 之一仅用于演示目的(实际上是在画布上绘制的一些形状)。

标签: .net wpf design-patterns mvvm


【解决方案1】:

我总是选择第一个选项。

此选项是遵循 MVVM 的选项,并且生成的架构更清晰、更易于理解。

【讨论】:

  • 哎呀!请重新检查箭头。我犯了一个错误。两个方向是一个方向箭头。谢谢!
  • 它仍然更接近原始的 MVVM 模式。并且不要忘记您的需求将来可能会发生变化,您可能需要从两个 ViewModel 更改模型,或者从 Model 更新两个 ViewModel。
【解决方案2】:

如果您没有将 Mediator 作为 MVVM 结构 (MVVM + M) 的一部分实现。选项 1 可以正常工作。如果您将中介模式添加到您的结构中以备将来使用,这将是非常好的时间投入。

只要不直接从view访问数据,所有数据都是通过viewmodel访问的,可以get也可以set,就可以了。

【讨论】:

  • 实际上我使用了来自 MVVM Foundation 的信使类,用于其他一些通信目的,所以我的问题不完全是这样。这更像是两者之间的“哲学上”正确。
  • 好的,选项 1 很好。我在我的应用程序的一部分中做同样的事情。您不需要介于两者之间的消息传递结构。规则很简单。只要您的视图没有直接设置或获取信息就可以了。如果您要使用 Silverlight 视图,它应该可以在您更改视图模型中的任何内容的情况下工作。希望我回答了你的问题。
  • 哎呀!请重新检查箭头。我犯了一个错误。两个方向是一个方向箭头。谢谢!
猜你喜欢
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多