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

时间:2012-01-19 17:29:01

标签: c# wpf mvvm

我有viewmodel1和viewmodel2。

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

因此,Viewmodel1和Viewmodel2都需要“了解”模型。

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

我应该在app中创建模型并为viewmodel1和viewmodel2提供对它的引用或?

3 个答案:

答案 0 :(得分:2)

如果我将ViewModel视为一个仅为View翻译的模型,我觉得它会有所帮助。

您有几个选择:

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

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

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

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

如果您之前没有做过多次依赖注入,请考虑通过构造函数进行。这将帮助您避免在事情发生之前尝试使用ViewModel的情况,并让ViewModel自行完成工作。您可能还想查看UnityCastle Windsor等框架,这些框架可以帮助您进行此类布线,但这仅适用于大型企业项目(甚至不是所有项目)。

答案 1 :(得分:2)

这很好。 Models意味着他们的声音:数据模型。它们意味着是保存数据的虚拟对象,应用程序的其余部分可以根据需要使用它们。

ViewModels是反映View的模型。例如,假设您有LoginViewModelManageUsersViewModel。两个ViewModel都可以使用UserModel数据对象,但是它们完全不同于ViewModel。

在大多数情况下,我会负责将Models加载到ViewModel。例如,您通常不会在用户登录之前预加载用户列表,因此您可以使用其User对象。 Insetad,您的LoginViewModel将自己进行数据库调用以获取用户登录的用户模型,而ManagerUsersViewModel将进行自己的数据库调用以获取可修改的用户列表。 / p>

答案 2 :(得分:0)

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

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

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

如果你提到的List是永远不会改变的,你应该尝试为此创建一个单独的ViewModel,并在其他viewmodel中引用该viewmodel。

问候。