使用1个模型的多个视图模型

本文关键字:模型 视图 1个 使用 | 更新日期: 2023-09-27 18:20:53

我有viewmodel1和viewmodel2。

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

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

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

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

使用1个模型的多个视图模型

如果我认为ViewModel是一个模型,只为视图翻译,我会发现这很有帮助。

你有几个选择:

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

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

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

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

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

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

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

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

你一定是想错了。。在MVVM中,您的模型一直包含在ViewModels中。。比方说,如果有一个ObservableCollection,那么在您的viewmodel中就会有一个属性,您应该在viewmodel的构造函数/某个方法中初始化这个集合。。两个视图模型都将初始化ProductTypes,如下所示。。在我看来,你应该尝试创建Classed For Model、ViewModel、Repository,并在其中使用IoC。

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

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

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

谨致问候。