【问题标题】:MVVM Light DI to share data between VMs?MVVM Light DI 在虚拟机之间共享数据?
【发布时间】:2013-03-31 00:01:02
【问题描述】:

目前我正在使用 DI 在虚拟机之间传递数据,想象一下搜索页面和结果页面或主/详细信息的场景。

因此,在这种情况下,我应该创建一个称为“参数 VM”的 VM(带有或不带有模型)来存储我的搜索参数,并在详细信息或结果 VM 中读取它们。

我还在 VMLocator 中注册了这个参数 VM,并将其注入到两个 VM 的构造函数中。

我得到的是,当我搜索新数据并将要搜索的数据存储在此参数 VM 中时,我在结果/详细信息 VM 中也成功获取了数据。

所以这是一种使用 MVVM Light 的经过验证的模式,尽管在网络上没有很好的记录,但我的问题是,这在性能和代码可读性方面是否是一个好方法。我想知道是否有人在不使用 MVVM Light 中的消息系统的情况下使用另一种方法。

我对这种方法的一个烦恼是我必须将我的参数封装在一个继承 ViewModelBase 的 VM 中,如果我想注入一个普通类,我无法将更改传播到第二个 VM,我仍然不知道为什么我不能对一个简单的课程做同样的事情,我想知道是否有人也知道原因。我在 VM 中创建一个简单类的原因是因为在 WP 和 W8 中,通过这种方式,我可以使用 VMLocator 中的工厂在应用程序停用和激活时恢复模型的状态。

我会很感激你的 cmets!

【问题讨论】:

    标签: design-patterns mvvm dependency-injection mvvm-light


    【解决方案1】:

    根据我的经验,使用 Messenger 是在虚拟机之间以解耦方式进行通信的最佳方式,我认为 IOC,特别是 MVVM Light 中的 SimpleIOC,是一种将依赖项注入虚拟机(如存储库、服务等)的方式。

    View ----RelayCommand---> VM
    
    VM ----Messenger----> VM
    
    Repositories ---- SimpleIOC ---> VM
    

    【讨论】:

    • 所以你认为IOC应该只用于注入虚拟机、服务、导航、应用程序状态等?对于对象使用 Messenger?
    • 是的,这就是我到目前为止使用 MVVM 的方式。
    【解决方案2】:

    我们在模块化 WPF 应用程序中使用 EventAggregator 模式。在这种情况下,您的视图模型不需要相互了解。相反,它们都共享一个作为构造函数参数注入的 IEventAggregator 服务实例。 Master ViewModel then publish events with special event class (for example when selection changes), and detail ViewModel subscribes on events of that type and, when event occurs, react on them (by showing new details).使用这种模式,您可以设置不同项目中的视图模型的通信,而无需任何紧密耦合。当然,两个视图模型都共享他们可以处理的事件类知识。

    互联网上有多种实现这种模式的方法。其中一些可以直接从 VisualStudio 中使用 NuGet 安装,例如 Caliburn.Micro.EventAggregator

    希望对您有所帮助 =)

    【讨论】:

    • 谢谢,我相信这是一个很好的模式,我不确定,但我认为与 MVVM Light 中的 Messenger 类使用的模式相同,但事件聚合器似乎更优雅一些跨度>
    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2012-04-03
    • 2015-01-10
    • 2022-07-17
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多