不是Singleton ViewModel并且仍在同步

时间:2011-06-04 23:15:58

标签: c# .net wpf data-binding mvvm

我想有两个(甚至更多)不同的WPF窗口(使用MVVM!)但绑定到相同的类型ViewModel主要是我需要这两个窗口才能同步内容,两者都显示相同的可观察集合。

使用ViewModel的Singleton Pattern设计可以很容易地进行同步,但我被告知单例ViewModels是一个糟糕的设计。

那么,在何时何地分配datacontext以及在何处创建ViewModels以解决此问题的最佳策略是什么?

1 个答案:

答案 0 :(得分:4)

ViewModels可以拥有公开其他ViewModel的属性。外部ViewModel的View可以与内部ViewModel绑定ContentControl

通过这种方式,您可以拥有与Windows本身绑定的单独ViewModel实例,并且只有这两个视图之间需要相同的部分才应位于共享内部ViewModel中。因此,您的内部ViewModel可以像集合一样公开数据,而绑定到各自Windows的单独ViewModel可以跟踪集合中的所选项目。

但我认为通常人们会确保数据本身(模型)是共享的,如果有的话,而不是ViewModel,因为ViewModel倾向于封装除数据之外的行为,并且你必须非常小心一个动作。窗口与不同窗口上的相同操作完全相同。由于意外的副作用,它很有可能使用户感到困惑。

至于如何使这更容易,如果你没有使用MVVM框架,你可以尝试一下。 MVVM Light如果您没有使用过Caliburn Micro,那么这是一个很好的开始,尽管我个人使用This article。 MVVM Light有一个ViewModelLocator的模板,可用于控制ViewModel创建/引用,您基本上可以自己编辑/添加到ViewModelLocator。两者都适用于IOC容器,这可以让您更好地控制ViewModel的创建。

例如,每次打开外部ViewModel的新窗口时,您都已使用IOC容器注册了ViewModel,以便每次都创建一个新实例。当外部ViewModel需要内部ViewModel的实例时,您已在容器中注册了一个实例,而不是每次都创建一个新实例。 (这是通过使用IOC容器作为服务定位器还是实际依赖注入来实现的。)

{{3}}也可能是有意义的。

如果您对原始问题需要澄清,请发表评论,因为它有点宽泛。有很多方法可以做你想做的事。