Silverlight 如何以及在何处放置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。但我真的不知道该在哪里处理,何时处理,如何处理!好啊我可以想象什么时候,怎样。。但是在哪里呢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,以
如果你认为我很困惑,你是对的 如果我理解正确,您使用的是同一个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。