问题描述
|
MVVM模式与MVVM Light相比更好,很棒,但是有时候我觉得我什么都不懂。
我在SL 4中有一个业务应用程序,到目前为止,我已经有18个VM ..和更多的东西要写!我正在应用Laurent Bugnion在MIX11的会议中使用的模式(带有SimpleIoc类)。
一个视图模型绑定到一个视图(命名为\“ A \”),但是同样的视图模型也绑定到另一个视图(命名为\“ B \”)。在viewmodelLocator中以标准方式调用与视图\“ A \”绑定的viewmodel。与视图B绑定的viewmodel用不同的键调用,以确保它们是2个不同的距离。此外,它们还注入了不同的DomainService,因此与视图上的控件绑定的实体是不同的。
视图模型注册了一些消息,以跟踪与之交互的其他视图模型的变化,例如,更改选择意味着用户希望显示其他内容以便检索数据库上的数据。
问题是如果我先调用视图A,然后再调用视图B,则我为相同的消息注册了2次,因此我对DB执行了2次操作。
我认为正确的是,当我调用视图B时(通常是在关闭视图A时),将绑定到视图A的视图模型设置为正确。但是我真的不知道在哪里,何时何地配置它!好吧..我可以想象何时何地..但是在哪里?
如果您认为我很困惑,那您是对的!
解决方法
如果我对您的理解正确,那么您正在使用具有两个不同视图的相同ViewModel。您一次只需要一个虚拟机副本。
在这种情况下,我可能会使用VM的父级,然后修改VM上的Mode属性。
<DataTemplate x:Key=\"ViewA\" TargetType=\"{x:Type local:MyViewModel}\">
<TextBlock Text=\"I\'m View A\" />
</DataTemplate>
<DataTemplate x:Key=\"ViewB\" TargetType=\"{x:Type local:MyViewModel}\">
<TextBlock Text=\"I\'m View B\" />
</DataTemplate>
<DataTemplate DataType=\"{x:Type local:MyViewModel}\">
<ContentControl Content=\"{Binding }\">
<ContentControl.Style>
<Style TargetType=\"{x:Type ContentControl}\">
<Setter Property=\"ContentTemplate\" Value=\"{StaticResource ViewA}\" />
<Style.Triggers>
<DataTrigger Binding=\"{Binding Mode}\" Value=\"2\">
<Setter Property=\"ContentTemplate\" Value=\"{StaticResource ViewB}\" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
然后要切换视图,我只需设置ParentViewModel.CurrentViewModel.Mode = 2
,就可以在不更改ViewModel的情况下切换视图。
如果您想要同一个ViewModel的两个不同副本,我仍将使用ParentViewModel.CurrentViewModel = ViewModelInstanceB
之类的东西来处理ParentViewModel中的切换,并将ViewModelInstanceB.Mode
设置为2
如果您感兴趣,我在这里写了一些在视图之间切换的示例