viewmodel绑定到视图(将其命名为“A”),但同样的viewmodel也绑定到另一个视图(将其命名为“B”)。与视图“A”绑定的Viewmodel在ViewModelLocator中以标准方式调用。使用不同的键调用与视图B绑定的Viewmodel,以确保它们是2个不同的istances。除了它们注入了不同的DomainService,因此实体与视图上的控件绑定是不同的。
视图模型为某些消息注册以跟踪其交互的其他视图模型中的变化,例如,选择更改意味着用户想要显示其他内容以便在数据库上检索数据。)
问题是如果我调用视图A然后查看B我注册了相同的消息2次,所以我在数据库上进行了2次操作。
我认为正确的是当我调用视图B时(通常在我关闭视图A时)处理绑定到视图A的视图模型。但我真的不知道在哪里处理它,何时以及如何处理它!好的..我可以想象何时以及如何...但在哪里?
如果你认为我很困惑,那你就对了!
答案 0 :(得分:1)
如果我理解正确,您将使用具有两个不同视图的相同ViewModel。您只希望一次只存在一个VM副本。
在这种情况下,我可能会使用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
如果你感兴趣的话,我写了一些在Views here之间切换的例子