【问题标题】:Multiple viewmodels using 1 model?使用 1 个模型的多个视图模型?
【发布时间】:2012-02-14 09:01:51
【问题描述】:

我有 viewmodel1 和 viewmodel2。

Viewmodel1 需要显示模型中包含的某种列表中的数据。 Viewmodel2 需要向模型中包含的列表输入数据。

所以 Viewmodel1 和 Viewmodel2 都需要“了解”模型。

在 MVVM 中执行此操作的正确方法是什么?

我应该在应用程序中创建模型并给 viewmodel1 和 viewmodel2 一个引用还是?

【问题讨论】:

  • 你能展示一些你的模型是什么样子的代码吗?
  • 我还没有开始编写代码。例如: Model 对象包含一个人员列表。 Viewmodel1 只是在视图上显示此列表。 Viewmodel2 将一个新人插入到列表中。因此,这两个视图模型都需要与 Model 对象建立连接
  • 所以两个视图模型都在一个视图上?

标签: c# wpf mvvm


【解决方案1】:

我发现如果我将 ViewModel 视为一个模型,只为 View 翻译,这会有所帮助。

你有几个选择:

  • 创建一个设置 ViewModel 的 控制器。如果 ViewModel 需要来自多个地方的信息,这通常是一个不错的选择。您可以为 ViewModel 提供它所需的所有信息的引用,或者将其设为普通旧 .NET 对象 (PONO),并让控制器为您设置。

  • 只需按照您的建议将引用传递给 ViewModel。如果不同类之间不需要交互,则很有用

  • 连接EventAggregator,可用于在模型更改时发布通知,并将Repository 传递给 ViewModel,以便他们每个人都可以在需要时获取/存储模型到。

我真的很喜欢最后一种模式,因为如果您发现需要更多能够访问此类模型的演示者或控制器,它可以轻松扩展。它还允许您注入一个存储库,这意味着您以后可以更轻松地迁移到一个不错的 RESTful 面向服务的架构。

如果您之前没有做过很多依赖注入,请考虑通过构造函数进行。这将帮助您避免在准备好之前尝试使用您的 ViewModel 的情况,并让 ViewModel 完成自己的工作。您可能还想查看像 UnityCastle Windsor 这样的框架,它们可以帮助您进行这种接线,但这实际上只适用于大型企业项目(甚至不是所有项目)。

【讨论】:

    【解决方案2】:

    这很好。 Models 就像听起来一样:数据模型。它们是用来保存数据的虚拟对象,应用程序的其余部分可以根据需要使用它们。

    ViewModels 是反映视图的模型。例如,假设您有一个LoginViewModel 和一个ManageUsersViewModel。两个 ViewModel 都可以使用 UserModel 数据对象,但是它们是完全不同的 ViewModel,用于完全不同的事情。

    在大多数情况下,我会将加载Models 的责任留给ViewModel。例如,您通常不会在用户登录之前预加载用户列表,这样您就可以使用他们的用户对象。 Insetad,您的LoginViewModel 将进行自己的数据库调用以获取用户登录的用户模型,而ManagerUsersViewModel 将进行自己的数据库调用以获取可以修改的用户列表。

    【讨论】:

    • 我没有使用 C# 的经验。但即便如此,我一直被教导说,业务逻辑的正确位置是在模型中。更不用说数据库调用了,这始终是模型的职责。
    【解决方案3】:

    您一定是以错误的方式思考.. 在 MVVM 中,您的模型一直包含在 ViewModels 中,一直到视图.. 假设如果有 ObservableCollection,那么您的 viewmodel 中会有一个属性,您应该在 ViewModel 的构造函数/某些方法中初始化此集合。两个视图模型都会像这样初始化 ProductTypes。在我看来,您应该尝试为 Model、ViewModel、Repository 创建 Classed 并在其中使用 IoC。

    这是一个关于 mvvm 的非常好的视频,你应该试试这个视频并看看代码。

    http://blog.lab49.com/archives/2650

    如果您提到的列表是永远不会改变的,您应该尝试为此创建一个单例视图模型并在其他视图模型中引用该视图模型。

    问候。

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多