在ViewModels之间共享状态/更改

时间:2010-06-10 20:39:07

标签: wpf xaml mvvm

我有一个App,它有一个Tasks选项卡和一个Projects选项卡。我决定为每个选项卡,TasksViewModel和ProjectsViewModel创建一个单独的ViewModel。

“任务”选项卡有一个新的任务区域,其中包含一个关联的项目下拉,“项目”选项卡(显然)有一个项目列表。

我想要的是“任务”选项卡上的下拉列表与“项目”选项卡列表共享相同的集合,以便每次在“项目”选项卡上添加或删除项目时,“任务”选项卡上的列表都是最新的自动。这适用于单个ViewModel,但它开始变得非常不守规矩。

我不应该分成两个ViewModel吗?有没有像这样共享数据的常用方法?也许将相同的ObservableCollection<Project>传递给每个ViewModel?也许某种类型的通知返回到ICollectionChanged

行的TasksViewModel

欣赏任何见解/输入!

2 个答案:

答案 0 :(得分:5)

这里最简单的解决方案通常是使用某种形式的Messaging Service在两个ViewModel之间传递信息。

例如,MVVM Light Toolkit为此类情况提供了IMessenger interface

使用好的IoC或DI工具集也可以在这种情况下提供帮助。这样您就可以将项目集合动态地注入到两个ViewModel中,从而允许在两个视图中使用共享集合。

答案 1 :(得分:3)

在我看来,您的“任务”和“项目”概念是模型的一部分,而不是视图模型的一部分。

考虑这个概念性练习:假设您的应用程序已编写,以便两个用户可以在两台独立的计算机上使用您的应用程序来对抗共享数据库,并且一个用户添加了一个项目:

  1. 如果项目立即显示在其他用户屏幕的“任务”选项卡上的下拉列表中,这会是好事还是坏事?
  2. 如果项目在第一个用户点击“保存”或“提交”或“确定”后出现在该下拉列表中会不会是好事还是坏事?
  3. 如果对这两个问题中的任何一个问题的回答是“好事”,那么您的数据实际上是模型的一部分,而不是视图模型。它应该这样处理。

    您的视图模型应该通过引用合并您的实际模型,并且尽可能地在视图模型之间共享模型对象是一件好事。实际上,理想情况下,大多数应用程序都有一组模型对象。例外可能是一个对话框,您希望能够进行一些更改,然后点击“取消”而不保存它们。在这种情况下,“确定”按钮会将对话框维护的模型中的数据复制到主应用程序模型中。在这种情况下,对话框和主应用程序使用的模型对象是同一类的不同实例。

    现在让我们考虑一下你对这两个问题都回答“坏事”的情况。这将是一个应用程序,您永远不会将“项目”列表保存回主数据库/文档/其他,但它是一个临时列表,仅用于临时工作。在这种情况下,它实际上是一个视图模型,我会将它附加到应用程序(或适当的任何范围),并让两个选项卡访问它。