WPF-在多个视图上共享相同的数据

本文关键字:数据 共享 视图 WPF- | 更新日期: 2023-09-27 18:26:35

我目前正在为我正在开发的游戏设置一个简单编辑器的结构。这个编辑器基本上会加载/保存一个序列化的文件,然后游戏可以使用它来做任何它想要的事情。

我把这个序列化文件看作是一个数据库,因为它包含多个视图经常使用的数据,可能同时使用。由于这个想法,我想把所有这些数据(对象、字符串、整数等的列表)放在一个集中的位置,所有视图都可以读取、更新、添加等等。

我首先想到的是一个引用了反序列化数据的singleton类,然后相应地对其进行数据绑定,以便所有打开的视图在任何时候发生更改时都会收到通知。

但我想知道,WPF是否希望您解决这个问题,而不是(直接)绑定到单例、静态数据或代理属性(只从单例返回数据的数据上下文中的属性)?还是这只是一条路?

WPF-在多个视图上共享相同的数据

如注释中所述,在ViewModel之间共享"数据"的最简单方法是在实例化每个数据后将引用传递给它们。

var sharedModel = new SharedModel();
var viewModel1 = new ViewModel1(sharedModel);
var viewModel2 = new ViewModel2(sharedModel);

其中一个共享ViewModel的Ctor将具有所需的任何Model作为参数。

public ViewModel1(SharedModel model) { ... }

如果您不想手动将每个依赖项"注入"到关联的ViewModel中,可以使用Unity,这是一个控制反转(IoC)容器,它将通过依赖项注入(DI)自动将适用的依赖项注入到ViewModel中。对于DI,您通常希望每个模型都有一个关联的接口,这样就不会使用具体的类型。您也可以注册具体类型。

因此,例如,新的共享模型将看起来像:

public class SharedModel : ISharedModel { ... }

以及需要它的ViewModels,将有一个新的构造函数和一个接口

public class ViewModel1 : IViewModel1
{
    public ViewModel1(ISharedModel model) { ... }   
}

然后,使用Unity,您可以将ViewModels和Models注册到同一个IoC中。

var container = new UnityContainer();
// this will cause the Model to only be created once and shared to other types that have been registered in the container
//
container.RegisterType<ISharedModel, SharedModel>(new ContainerControlledLifetimeManager()); 
container.RegisterType<IViewModel1, ViewModel1>();
container.RegisterType<IViewModel2, ViewModel2>();

所以现在,所有的东西都生活在Unity容器中。一旦解决了所需的ViewModel,就不需要自动注入任何依赖项,Unity将为您处理它。

var viewModel1 = container.Resolve<IViewModel1>();

如果您想了解更多关于DI和Unity的信息,请查看:http://msdn.microsoft.com/en-us/library/dn178463(v=pandp.30).aspx