WPF MVVM 共享数据源



我接到了一个新项目的任务。我熟悉 WPF 和 mvvm,并在使用它的生产项目中完成了一些工作。

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

1) 在两个视图之间创建一个共享视图模型。我不太喜欢这个选项 - 虽然它们确实使用相同的数据源,但两个视图对数据的作用却大不相同。

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

理想情况下,我想要的是某种广播模式,其中数据被检索和广播 - 每个视图模型被创建,然后抓取广播的消息(通过某种类型的信使)。然后在后续更新时,信使会让视图模型知道更新即将到来。

我已经查看了调解器模式(使用消息传递),但这并不完全满足我的需求。我不想为了注册消息而创建视图模型。

我知道可能没有一些"银弹"解决方案。只是在寻找有关解决此问题的最佳方法的想法。

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

public class ViewModelLocator
{
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SimpleIoc.Default.Register<IDataService, DataService>();
    }
}

使用接口,因此我们可以随意交换数据服务,甚至可以在设计时换出不同的接口。 因此,您将创建一个接口来定义您将使用的方法,并确保您的数据服务实现它们。 在数据服务实现中,您将使用共享上下文/源。

public class DataService: IDataService
{
     //USE SAME SOURCE (example EF)
     private SharedSourceEntities context;
     (blah blah)...
}

之后,您可以在构造函数中或调用服务定位器中将其注入到两个视图模型中。

依赖注入:

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>();

相关内容

最新更新