如何在多个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框架。
任何代码示例都将不胜感激。
答案 0 :(得分:7)
我会创建一个ViewModel,作为所有Project ViewModel的父级。 (我们称之为解决方案)
解决方案ViewModel将拥有属性ActiveProject和一个可观察的项目集合。
答案 1 :(得分:5)
我会推荐Mediator Pattern。我之前在VM之间使用了EventAggregator来进行这种类型的消息传递,实际上并没有多少。
答案 2 :(得分:3)
不要,不要。不要在MVVM应用程序中以这种方式使用单例。实际上,Project类应该是ViewModel的模型。只需在vm的构造函数中传递它。如果你真的需要在多个vm中共享一个Project类的实例,那么在构造视图模型时使用工厂和某种类型的缓存。如果您的vm需要更多信息,只需创建一个特殊的Model类,它将派生自Project(或实现IProject),因此您可以轻松使用接口隔离原则。
答案 3 :(得分:1)
在导航到新视图模型之前,您可以使用静态集合来填充视图模型。然后,目标视图模型可以从其构造函数中检索数据。
例如,ViewModel1(VM1)将创建一个Project并填充它。然后,VM1将项目放入碎片静态集合中。然后,VM1将导航到另一个视图模型(VM2)。在VM2的构造函数中,您将转到集合并检索由VM1放置在那里的项目。
如果您使用键值对字典,它还允许您在视图模型之间共享其他数据。
答案 4 :(得分:1)
Singleton肯定会有所帮助。要实现,如果我有一个名为User的类:
private static User mInstance;
private User () //constructor
{
}
public static User Instance
{
get
{
if (mInstance == null)
mInstance = new User();
return mInstance;
}
}