Silverlight 如何以及在何处放置ViewModel?

Silverlight 如何以及在何处放置ViewModel?,silverlight,silverlight-4.0,mvvm,mvvm-light,wcf-ria-services,Silverlight,Silverlight 4.0,Mvvm,Mvvm Light,Wcf Ria Services,MVVM模式很好,MVVM Light更好,但有时我觉得我什么都不懂。 我在SL 4中有一个业务应用程序,到目前为止,我已经有了18个VM。。还有更多的东西要写!我正在应用Laurent Bugnon在MIX11会议中使用的模式(使用SimpleIoc类) 视图模型绑定到一个视图(将其命名为“A”),但同一个视图模型也绑定到另一个视图(将其命名为“B”)。在ViewModelLocator中,以标准方式调用与视图“A”绑定的Viewmodel。使用不同的键调用与视图B绑定的Viewmodel,以

MVVM模式很好,MVVM Light更好,但有时我觉得我什么都不懂。 我在SL 4中有一个业务应用程序,到目前为止,我已经有了18个VM。。还有更多的东西要写!我正在应用Laurent Bugnon在MIX11会议中使用的模式(使用SimpleIoc类)

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

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

问题是,如果我调用视图A,然后调用视图B,我会为相同的消息注册两次,所以我在DB上有两个操作

我认为正确的做法是,在调用视图B时(通常在关闭视图A时),将viewmodel绑定到视图A。但我真的不知道该在哪里处理,何时处理,如何处理!好啊我可以想象什么时候,怎样。。但是在哪里呢


如果你认为我很困惑,你是对的

如果我理解正确,您使用的是同一个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


如果您感兴趣,我写了一些在视图之间切换的示例

谢谢您的回答,Rachel。问题略有不同。问题不在于获取同一viewmodel的单个实例。问题是在内存中只保留一个实例,而不是两个。如果在viewmodel的构造函数中我有“Messenger.Default.Register(this,(x)=>DoSomething());”,则该viewmodel的两个实例表示在我发送“Messenger.Default.send(new SomeToken())”时对DoSomething()的两个不同调用。我想处理绑定到视图的viewmodel未激活。@Angelo我仍然会在父viewmodel中这样做。注册第二个VM时,请处置第一个VM。