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

时间:2014-10-15 18:16:19

标签: c# wpf data-binding

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

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

我的第一个想法是转到一个单例类,它引用了反序列化的数据,然后数据绑定,因此所有打开的视图都会在任何时候发生变化时收到通知。

但是我想知道,有没有一种方法WPF希望你解决这个问题,而不是(直接)绑定到单例,静态数据或代理属性(datacontext中的属性,它只返回单例中的数据) ?或者这只是要走的路?

1 个答案:

答案 0 :(得分:3)

正如评论中所提到的,分享数据的最简单方法是" ViewModel之间的目的是在每个实例化后将引用传递给它们。

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

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

public ViewModel1(SharedModel model) { ... }

如果您不想手动注入'每个依赖关系到相关的ViewModel,您可以使用Unity,这是一个控制反转(IoC)容器,它将通过依赖注入(DI)自动将适用的依赖注入ViewModel。使用DI,您通常需要为每个模型建立一个关联的接口,以便您不使用具体类型。您也可以注册具体类型。

因此,例如,新的共享模型将如下所示:

public class SharedModel : ISharedModel { ... }

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

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

然后,使用Unity,您可以将ViewModel和模型注册到同一个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