如何解决如何以及在何处放置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
如果您感兴趣,我在这里写了一些在视图之间切换的示例
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。