Wpf 跨视图模型共享状态/更改

Wpf 跨视图模型共享状态/更改,wpf,xaml,mvvm,Wpf,Xaml,Mvvm,我有一个应用程序,它有一个任务选项卡和一个项目选项卡。我决定为每个选项卡、TasksViewModel和ProjectsViewModel创建一个单独的视图模型 “任务”选项卡有一个带有关联项目下拉列表的新任务区域,“项目”选项卡(显然)有一个项目列表 我希望Tasks选项卡上的下拉列表与Projects选项卡列表共享同一个集合,这样每当我在Projects选项卡上添加或删除项目时,Tasks选项卡上的列表都会自动更新。这在单个ViewModel中运行良好,但它开始变得非常难以控制 我不应该分成

我有一个应用程序,它有一个任务选项卡和一个项目选项卡。我决定为每个选项卡、TasksViewModel和ProjectsViewModel创建一个单独的视图模型

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

我希望Tasks选项卡上的下拉列表与Projects选项卡列表共享同一个集合,这样每当我在Projects选项卡上添加或删除项目时,Tasks选项卡上的列表都会自动更新。这在单个ViewModel中运行良好,但它开始变得非常难以控制

我不应该分成两个视图模型吗?有这样一种共享数据的通用方法吗?可能会将相同的
observateCollection
传递到每个ViewModels中?可能是某种类型的通知返回到TasksViewModel,其行为
ICollectionChanged


感谢您的任何见解/意见

这里最简单的解决方案通常是使用某种形式的消息传递服务在两个ViewModels之间传递信息

例如,为这样的情况提供了一个解决方案


在这种情况下,使用好的IoC或DI工具集也会有所帮助。这将允许您将项目集合动态地注入到两个视图模型中,允许在两个视图中使用共享集合。

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

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

  • 如果项目立即出现在其他用户屏幕的任务选项卡上的下拉列表中,这是好事还是坏事
  • 如果项目在第一个用户点击“保存”、“提交”或“确定”后出现在下拉列表中,这是好事还是坏事

  • 如果这两个问题的答案都是“一件好事”,那么数据实际上是模型的一部分,而不是视图模型。应该这样处理

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


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

    我同意,但前提是数据确实是视图模型的一部分,而不是模型的一部分。如果它实际上是模型的一部分,我会说在视图模型之间来回传递它将是一个非常糟糕的主意:在整个应用程序中共享单个模型要好得多。我在答复中对此作了进一步解释。(是的,我确实意识到DI是实现共享通用模型的一个好方法,但我认为识别它是非常重要的。)Thaks Reed,我喜欢消息传递的想法。我在WebformsMVP框架中使用了类似的功能。“如果这些问题的答案是‘是’,那么当问题是‘如果……,它是好还是坏?’时,“是’、‘好’还是‘坏’?”