如何拥有多对"View-ViewModel"?

Gia*_*cci 12 c# wpf mvvm mvvm-light

我正在构建一个基于MVVM-Light的应用程序.我需要创建同一个View的多个实例,每个实例都应绑定到自己的ViewModel.

默认情况下将ViewModelLocatorViewModels实现为单例,因此同一View的不同实例将绑定到同一ViewModel.

我可以在VMLocator中创建ViewModel作为非静态对象(就像返回新VM()...一样简单),但这只会对我有所帮助.事实上,我仍然需要跟踪打开的窗口.然而,每个窗口可能会打开其他几个窗口(不同类型).在这种情况下,我可能需要在父View及其所有子项上执行一些操作.例如,在关闭View P之前,我可能想要关闭它的所有子节点(视图C1,视图C2等).

因此,有没有简单易行的方法来实现这一目标?或者你有什么建议我遵循的最佳做法?

提前感谢您的宝贵帮助.

干杯,
Gianluca.

LBu*_*ion 11

没有义务将ViewModel作为单例存储在ViewModelLocator中,但如果视图也是单例,它肯定会使它们更容易找到.显然,如果您有相同View类的多个实例,那么您将拥有同一ViewModel类的多个实例,并且它不再是单例.

要跟踪ViewModel的多个实例,可以在ViewModelLocator中实现一个字典,该字典根据键查找ViewModel.例如,密钥可以是视图的唯一ID.获取视图后,检索其密钥,然后从定位器中检索viewmodel.

更新:通常您甚至不需要跟踪多个视图模型.例如,您可以让Messenger类使用Send重载向给定viewmodel类的所有实例发送消息.因此,在实施字典以跟踪VM之前,请问自己是否真的需要它!;)

希望有所帮助,劳伦特

  • @LBugnion所以作为一个程序员,这个答案是有道理的,这就是我在这里的原因.但是,作为WPF和MVVM Light的新手,我可以实现字典并编写GetViewModel(字符串键).但现在呢?我是否将密钥传递给View并在构造函数后面的代码中设置其VM?或者是否有一种神奇的MVVM Light方式可以像单身人士一样从XAML做到这一点? (3认同)