MVVM模式和MVVM Light是很棒的,但有时我觉得我什么都不懂。我在SL4中有一个业务应用程序,到目前为止,我已经有了18个VM。还有更多的东西要写!我正在应用Laurent Bugnion在MIX11 (使用SimpleIoc类)的会话中使用的模式。
一个视图模型绑定到一个视图(命名为"A"),但完全相同的视图模型也绑定到另一个视图(命名为"B")。在ViewModelLocator中以标准方式调用绑定了视图A的Viewmodel。使用不同的键调用与视图B绑定的Viewmodel,以确保它们是两个不同的实例。此外,它们注入了不同的DomainService,因此实体与视图上的控件绑定是不同的。
视图模型注册了一些消息,以跟踪它所交互的其他视图模型中的变化,例如,选择的更改意味着用户希望显示其他内容,以便在数据库上检索数据)。
问题是,如果我调用视图A,然后调用视图B,我注册了两次相同的消息,所以我在DB上有两个操作。
我认为正确的做法是在调用视图B时(通常在关闭视图A时)处理绑定到视图A的视图模型。但我真的不知道该把它放在哪里,什么时候和如何处理!好的..。我可以想象什么时候以及怎样..。但是在哪里呢?
如果你觉得我糊涂了,那你说对了!
发布于 2011-05-31 02:19:20
如果我没理解错的话,您使用的是具有两个不同视图的相同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
如果您感兴趣,我写了一些在视图here之间切换的示例
https://stackoverflow.com/questions/6175563
复制相似问题