【问题标题】:How and where dispose a ViewModel?如何以及在哪里配置 ViewModel?
【发布时间】:2011-09-04 18:09:39
【问题描述】:

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

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

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

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

我认为正确的是在我调用视图 B 时(通常在我关闭视图 A 时)处理绑定到视图 A 的视图模型。但我真的不知道在哪里处理它,何时以及如何处理它!好的..我可以想象何时以及如何.. 但是在哪里?

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

【问题讨论】:

    标签: silverlight silverlight-4.0 mvvm mvvm-light wcf-ria-services


    【解决方案1】:

    如果我对您的理解正确,您使用的是具有两个不同视图的同一个 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

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

    【讨论】:

    • 感谢您的回答,瑞秋。问题略有不同。问题不在于获取相同视图模型的单个实例。问题是在内存中只保留一个实例而不是两个。如果在视图模型的构造函数中我有“Messenger.Default.Register(this, (x) => DoSomething());”,则该视图模型的两个实例意味着当我发送“Messenger”时对 DoSomething() 的两个不同调用.Default.Send(new SomeToken())"。我想处理绑定到视图的视图模型未激活。
    • @Angelo 我仍然会在父 ViewModel 中这样做。注册第二个 VM 后,处置第一个 VM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2013-01-29
    相关资源
    最近更新 更多