WPF MVVM共享数据源

WPF MVVM共享数据源,wpf,mvvm,mvvm-light,Wpf,Mvvm,Mvvm Light,我被指派了一个新项目。 我熟悉WPF和mvvm,并且已经完成了一些使用它的生产项目 最新的请求很简单,但需要在两个视图之间共享传入的数据源(每30秒刷新一次)。以下是我实现这一目标的几种方法: 1) 在两个视图之间创建一个共享视图模型。我真的不喜欢这个选项——虽然它们使用相同的数据源,但这两个视图对数据的处理方式却大不相同 2) 创建两个视图模型,其中一个是“父”视图模型,另一个是子视图模型。子视图模型注册来自父视图的消息。父视图模型发送该消息。虽然这是最容易启动和运行的,但我觉得会有很多代码围

我被指派了一个新项目。 我熟悉WPF和mvvm,并且已经完成了一些使用它的生产项目

最新的请求很简单,但需要在两个视图之间共享传入的数据源(每30秒刷新一次)。以下是我实现这一目标的几种方法:

1) 在两个视图之间创建一个共享视图模型。我真的不喜欢这个选项——虽然它们使用相同的数据源,但这两个视图对数据的处理方式却大不相同

2) 创建两个视图模型,其中一个是“父”视图模型,另一个是子视图模型。子视图模型注册来自父视图的消息。父视图模型发送该消息。虽然这是最容易启动和运行的,但我觉得会有很多代码围绕着应用程序的状态运行(它刚刚加载了吗?它已经加载了吗?这是数据刷新吗?)

理想情况下,我想要的是某种广播模式,在这种模式下,数据被检索和广播–每个viewmodel都被创建,然后(通过某种类型的messenger)获取广播消息。然后,在后续更新中,messenger会让viewmodels知道更新即将到来

我已经研究了中介模式(使用消息传递),但这并不完全满足我的需要。我不想为了注册消息而创建viewmodels

我知道可能没有什么“银弹”解决方案。只是想找到解决这个问题的最佳方法。

使用控制反转(IOC)和服务定位器模式来创建一个共享数据服务,它们也在讨论。我注意到你的mvvm轻标签;我知道默认的Mvvm light项目使用ViewModelLocator类和SimpleIOC,因此您可以注册如下所示的数据服务

public class ViewModelLocator
{
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SimpleIoc.Default.Register<IDataService, DataService>();
    }
}
之后,您可以在构造函数中或调用服务定位器中将其注入到两个视图模型中

依赖项注入:

public class ViewModelOne: ViewModelBase
{
    private readonly IDataService dataService;

    public ViewModelOne(IDataService dataService) 
    { 
        this.dataService = dataService;
    }
}

public class ViewModelTwo: ViewModelBase
{
    private readonly IDataService dataService;

    public ViewModelTwo(IDataService dataService) 
    { 
        this.dataService = dataService;
    }
}
SimpleIoc.Default.GetInstance<IDataService>();
服务地点:

public class ViewModelOne: ViewModelBase
{
    private readonly IDataService dataService;

    public ViewModelOne(IDataService dataService) 
    { 
        this.dataService = dataService;
    }
}

public class ViewModelTwo: ViewModelBase
{
    private readonly IDataService dataService;

    public ViewModelTwo(IDataService dataService) 
    { 
        this.dataService = dataService;
    }
}
SimpleIoc.Default.GetInstance<IDataService>();
SimpleIoc.Default.GetInstance();

Third:您的两个视图继承自的BaseViewModel。我不明白您所说的“我不想创建viewmodels以注册邮件”是什么意思。当然,如果您想要处理消息,那么您需要实例化它?你能进一步澄清为什么中介模式不起作用吗?在这种情况下,这听起来很理想——或者是一个注入viewmodel的共享数据服务(正如已经发布的)。中介模式至少为持有数据源的人提供控制权——将消息视为“推送消息”,当数据更改时广播,不必轮询更改,这意味着您不需要父/子结构——这是一种有效的关系,还是因为中介模式存在问题而产生的想法?如果这两个虚拟机在数据源以外的任何地方本质上都不相关,那么它们不应该是父/子。调解人模式对我来说就像你的银弹,除非有充分的理由不使用它是的,这就是我想做的。只是我还没有完全掌握如何实现中介模式。我已经开始掌握这一点了。如何调用服务定位器?SimpleIoc.Default.GetInstance();