【问题标题】:How do I communicate events between ViewModels in a .Net WPF MVVM application?如何在 .Net WPF MVVM 应用程序中的 ViewModel 之间传递事件?
【发布时间】:2017-02-17 16:16:46
【问题描述】:

我正在创建一个作为仪表板的 .Net WPF 应用程序。 我需要能够在仪表板上的不同视图模型之间交流事件。 这对我来说就像一个发布/订阅事件模型。

实施与 MVVM 框架完美契合的解决方案的最佳方法是什么? 我开始关注 Prism,但我想知道这是否对我的需求来说有点沉重。

有人可以推荐一种最佳实践方法并指出一些简单的方法吗 实现示例?

谢谢, 约翰B

【问题讨论】:

  • 我认为MVVM Light 有一个基于消息的事件系统,它可能比 Prism 更适合您的需求。
  • 您正在寻找事件聚合器。

标签: c# .net wpf mvvm


【解决方案1】:

请参阅以下博客文章,了解如何使用事件聚合器模式以松散耦合的方式在视图模型之间进行通信:https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/

这应该可以回答您的问题。

另一种选择是使用共享服务:https://social.msdn.microsoft.com/Forums/en-US/22907a0f-d805-4195-8272-7c284b72d2ee/example-of-using-shared-services-prism?forum=wpf

有一个如何使用 GitHub 上最新版本 Prism 中的 EventAggregator 类的示例:https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/EventAggregation

【讨论】:

    【解决方案2】:

    对于 MVVM,我肯定更喜欢使用 MVVMLIGHTLIBS。首先,有一个 eventtrigger 功能,你可以在其中做 mousedown、mouseup、selectionchanged 等。当你尝试为 eventtrigger 绑定命令时,它会让你的生活变得更轻松 例如:

    <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
              <i:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=employeeListBox, Path=SelectedValue}"/>
            </i:EventTrigger>
          </i:Interaction.Triggers>
        </ListBox>
    

    MyCommand 将在您的视图模型中使用 relaycommand 或 commandhandler 实现,无论您喜欢哪个。 此外,如果您想遵循 MVVM 模式,关于控件的绑定 clr 属性、依赖属性和附加属性的知识也非常重要。 我想分享几个例子: ---- 事件触发器--------- http://www.c-sharpcorner.com/blogs/example-of-eventtrigger-in-mvvm-application1 ----- 附加属性和依赖属性---- 总结一下: 附加属性适用于容器元素。比如你可以有grid,然后你可以创建grid.rowdefinition和grid.columndefinition来动态改变行数和列数

    依赖属性是派生自 DependencyObject 的类的属性,它们的特殊之处在于它们不是简单地使用支持字段来存储它们的值,而是在 DependencyObject 上使用一些辅助方法。

    这些是关于 wpf 和 mvvm 的非常基本的东西,它们涉及模型、视图和视图模型。

    【讨论】:

      猜你喜欢
      • 2013-02-02
      • 2012-09-20
      • 2012-04-18
      • 2020-03-03
      • 2015-12-19
      • 2021-01-08
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      相关资源
      最近更新 更多