【问题标题】:In MVVM there can be only one View for each one View Model?在 MVVM 中,每个 View Model 只能有一个 View?
【发布时间】:2011-08-02 04:58:33
【问题描述】:

我在这里读到:

http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx

通常是一对一的 视图和它的关系 查看模型。

这意味着它们在设计上并不能真正处理多个视图?

【问题讨论】:

标签: .net wpf silverlight xaml mvvm


【解决方案1】:

我认为在实践中通常是这种情况。然而,将演示文稿分离为 View 和 ViewModel 的好处意味着您可以轻松创建许多不同的 View,每个 View 显示来自 Model 的基本相同的数据,都共享相同的 ViewModel 类(可能相同,也可能不同实例)。例如,我可以有一个 simpleadvanced 数据视图,主要用 XAML 作为两个完全不同的 UserControl 编写,它们共享相同的 ViewModel(类或实例) .如果不使用 MVVM,如果不重复代码,这将更加棘手。

【讨论】:

  • 问题是便携性然后stackoverflow.com/questions/5607619/…
  • 可移植性问题与一个视图模型的多个视图有何关系?
  • 因为如果我想在多个平台上进行多个视图,并且使用 ms mvvm 不可移植,我无法使用它。
  • 如果您阅读了答案,则表明您可以,但是是的,不存在直接路径。
【解决方案2】:

我认为没有限制,这完全取决于您的设计和要求。您可以为单个 ViewModel 创建多个 View 以呈现不同的 UI 表示。

【讨论】:

  • 这表明 ViewModel 需要在 View 之前创建,但在许多示例中,您会看到 View 是先创建的。在 WinForms 中使用 Application.Run(new MainForm())) 并不容易首先创建 ViewModel
【解决方案3】:

在 MVVM 中,您有一个 View(演示文稿)和一个 ViewModel(逻辑),旨在支持该演示文稿的需求。您可以轻松地为 ViewModel 拥有多个视图,这通常是意料之中的,主要是在您有多个 DataTemplate 对象(这是一个视图)根据使用它的上下文绑定到单个 ViewModel 类型的情况下。

虽然这些通常是一对一的映射,但这不是限制,而是约定,并且在 MVVM 模式中没有“设计限制”。

【讨论】:

  • 如果必须使用 DataTemplate 选择器来获取多个视图,这又是一种怎样的约定?这可能不是便携式的stackoverflow.com/questions/5607619/…
  • 视图到视图模型的一对一映射是约定。实现多对一映射的方式取决于您。
【解决方案4】:

正确。通常,视图模型是专门为一个视图设计的。它没有关于视图中使用的特定控件的任何知识,但它确实具有结构和功能知识。拥有多个视图和一个视图模型通常会使视图模型类违反单一职责原则。

虽然,有时拥有多个视图和一个视图模型确实有意义。例如,同一视图的基本和高级版本。在基本版本中,您只需隐藏一些部分或通过简化功能以更简单的方式呈现信息。在这种情况下,为这两个视图使用一个视图模型是绝对可以的,否则您将不得不复制大部分视图模型的代码。

MVVM 模式不强制视图和视图模型之间的一对一关系,但在大多数情况下,这是推荐的方法。如果你想为一个视图模型拥有多个视图,你应该在走这条路之前仔细考虑,因为你最终可能会得到一个视图模型,其中一半成员被一个视图使用,另一半成员被另一个视图使用。

【讨论】:

    【解决方案5】:

    我实际上使用了这种一对一关系并没有在项目中强制执行的事实。

    我们有一个警报虚拟机,我们希望在我们的一个视图中将它们显示在列表中,但是当有新警报时也会弹出通知并在主屏幕中执行此操作。 通过将弹出控件的数据上下文设置为警报 vm,我们可以轻松实现此功能。

    【讨论】:

      猜你喜欢
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2012-11-01
      • 2012-10-16
      • 2019-05-29
      • 2014-01-10
      相关资源
      最近更新 更多