如何以及在何处处置ViewModel?

时间:2011-05-30 11:15:26

标签: silverlight silverlight-4.0 mvvm mvvm-light wcf-ria-services

MVVM模式对于MVVM Light来说更好,但有时候我觉得我什么都不懂。 我在SL 4中有一个商业应用程序,到目前为止,我已经有18个VM ..还有更多要写的!我正在应用他在MIX11会话中使用的模式Laurent Bugnion(使用SimpleIoc类)。

viewmodel绑定到视图(将其命名为“A”),但同样的viewmodel也绑定到另一个视图(将其命名为“B”)。与视图“A”绑定的Viewmodel在ViewModelLocator中以标准方式调用。使用不同的键调用与视图B绑定的Viewmodel,以确保它们是2个不同的istances。除了它们注入了不同的DomainService,因此实体与视图上的控件绑定是不同的。

视图模型为某些消息注册以跟踪其交互的其他视图模型中的变化,例如,选择更改意味着用户想要显示其他内容以便在数据库上检索数据。)

问题是如果我调用视图A然后查看B我注册了相同的消息2次,所以我在数据库上进行了2次操作。

我认为正确的是当我调用视图B时(通常在我关闭视图A时)处理绑定到视图A的视图模型。但我真的不知道在哪里处理它,何时以及如何处理它!好的..我可以想象何时以及如何...但在哪里?

如果你认为我很困惑,那你就对了!

1 个答案:

答案 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之间切换的例子