MVVM:在ViewModels之间共享数据

如何在多个ViewModel之间共享数据?

例如,在应用程序中有一个名为Project的类。

public class Project : ModelBase { private string _projectName; public string ProjectName { get { return _projectName; } set { _projectName = value; RaisePropertyChanged(() => ProjectName); } } } 

在多个ViewModels应用程序中应该访问ActiveProject。
在ViewModels之间共享Project的最佳方法是什么?

  • 调解员模式? (消息)
  • 静态对象
  • 单身模式(如果是的话怎么样?)

我之前使用过Messaging但它需要很多编码。 对于所有ViewModel,我要创建ActiveProject属性,还必须注册一个messenger来更新它。

我使用MVVM Light框架。
任何代码示例将不胜感激。

我将创建一个ViewModel,作为所有Project ViewModel的父级。 (我们称之为解决方案)

解决方案ViewModel将具有属性ActiveProject和可观察的项目集合。

我会推荐Mediator Pattern。 我之前在VM之间使用了一个EventAggregator这种类型的消息传递,但实际上并没有多少。

不要,不要。 不要在MVVM应用程序中以这种方式使用单例。 实际上,Project类应该是ViewModel的模型。 只需在vm的构造函数中传递它。 如果你真的需要在多个vm中共享一个Project类的实例,那么在构造视图模型时使用工厂和某种类型的缓存。 如果您的vm需要更多信息,只需创建一个特殊的Model类,它将派生自Project(或实现IProject),因此您可以轻松使用接口隔离原则。

Singleton肯定会有所帮助。 要实现,如果我有一个名为User的类:

  private static User mInstance; private User () //constructor { } public static User Instance { get { if (mInstance == null) mInstance = new User(); return mInstance; } } 

在导航到新视图模型之前,您可以使用静态集合来填充视图模型。 然后,目标视图模型可以从其构造函数中检索数据。

例如,ViewModel1(VM1)将创建一个项目并填充它。 然后,VM1将项目放入碎片静态集合中。 然后,VM1将导航到另一个视图模型(VM2)。 在VM2的构造函数中,您将转到集合并检索VM1放置在那里的项目。

如果您使用键值对字典,它还允许您在视图模型之间共享其他数据。