【问题标题】:WPF - Share same data over multiple viewsWPF - 在多个视图上共享相同的数据
【发布时间】:2014-12-10 22:22:44
【问题描述】:

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

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

我的第一个想法是使用一个引用反序列化数据的单例类,然后相应地对其进行数据绑定,以便所有打开的视图在任何时间发生变化时都会收到通知。

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

【问题讨论】:

  • 您的 ViewModel 是在哪里设置的?您可以创建一个模型(静态数据)并将引用传递给每个 ViewModel,然后将其绑定到单独的 View。 .. public MyVm(模型模型) { .. }
  • 这可以工作,最后它和单例一样,只是为每个 ViewModel 多写几行代码(存储传入的引用),但话又说回来:这是如何WPF 会希望你这样做吗?
  • 是的,对于每个 MVVM,ViewModels 通常被注入到关联的 ViewModels 中。你甚至可以使用依赖注入来做到这一点。
  • 所以我基本上为我的序列化数据制作了一个 ViewModel 并将其传递给需要它的视图,太酷了!你会碰巧有一些例子,文章,任何东西。特别是依赖注入听起来很有趣。
  • 我可以为你快速写一篇文章。我会在答案中发布它

标签: c# wpf data-binding


【解决方案1】:

如 cmets 中所述,在 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 { ... }

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

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 容器中。一旦你解决了需要的 ViewModels 就不需要 自动注入任何依赖项,Unity 会为您处理。

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

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

【讨论】:

  • 谢谢,非常感谢!我遇到了 IoC 模式,并且已经想知道如何应用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多