13

How do I share data between multiple ViewModels ?

For example there is a class named Project in application .

    public class Project : ModelBase
{
    private string _projectName;

    public string ProjectName
    {
        get { return _projectName; }
        set
        {
            _projectName = value;
            RaisePropertyChanged(() => ProjectName);
        }
    }
}

In multiple ViewModels application should access ActiveProject.
What's the best way to share Project between ViewModels ?

  • Mediator Pattern ? (Messaging)
  • Static object
  • Singleton pattern (If yes how?)

I've used Messaging before but it needs much codding . For all ViewModels I've to create ActiveProject property and also have to register a messenger to update that.


I use MVVM Light framework.
Any code example would be appreciated.

4

5 回答 5

7

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

解决方案视图模型将具有属性 ActiveProject 和一个可观察的项目集合。

于 2013-05-13T21:14:49.880 回答
6

我会推荐中介者模式。我之前在 VM 之间使用过 EventAggregator 来进行这种类型的消息传递,但实际上并没有太多。

于 2013-05-13T21:09:50.857 回答
3

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

于 2015-10-21T17:48:48.427 回答
1

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

    private static User mInstance;

    private User () //constructor
    {
    }

    public static User Instance
    {
        get
        {
            if (mInstance == null)
                mInstance = new User();
            return mInstance;
        }
    }
于 2013-05-13T21:09:32.497 回答
1

在导航到新视图模型之前,您可以拥有一个静态集合,您的视图模型会填充该集合。然后目标视图模型可以从它的构造函数中检索数据。

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

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

于 2013-05-13T21:02:05.400 回答