如何以及在何处放置ViewModel?

问题描述

| MVVM模式与MVVM Light相比更好,很棒,但是有时候我觉得我什么都不懂。 我在SL 4中有一个业务应用程序,到目前为止,我已经有18个VM ..和更多的东西要写!我正在应用Laurent Bugnion在MIX11的会议中使用的模式(带有SimpleIoc类)。 一个视图模型绑定到一个视图(命名为\“ A \”),但是同样的视图模型也绑定到另一个视图(命名为\“ B \”)。在viewmodelLocator中以标准方式调用与视图\“ A \”绑定的viewmodel。与视图B绑定的viewmodel用不同的键调用,以确保它们是2个不同的距离。此外,它们还注入了不同的DomainService,因此与视图上的控件绑定的实体是不同的。 视图模型注册了一些消息,以跟踪与之交互的其他视图模型的变化,例如,更改选择意味着用户希望显示其他内容以便检索数据库上的数据。 问题是如果我先调用视图A,然后再调用视图B,则我为相同的消息注册了2次,因此我对DB执行了2次操作。 我认为正确的是,当我调用视图B时(通常是在关闭视图A时),将绑定到视图A的视图模型设置为正确。但是我真的不知道在哪里,何时何地配置它!好吧..我可以想象何时何地..但是在哪里? 如果您认为我很困惑,那您是对的!     

解决方法

        如果我对您的理解正确,那么您正在使用具有两个不同视图的相同ViewModel。您一次只需要一个虚拟机副本。 在这种情况下,我可能会使用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 如果您感兴趣,我在这里写了一些在视图之间切换的示例     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...