MVVM:在ViewModels之间共享数据

时间:2013-05-13 20:55:38

标签: c# wpf design-patterns mvvm

如何在多个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框架。
任何代码示例都将不胜感激。

5 个答案:

答案 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;
        }
    }