【问题标题】:How do I notify a parent view of a child view event in an MVVM WPF application?如何在 MVVM WPF 应用程序中通知子视图事件的父视图?
【发布时间】:2017-09-14 21:43:07
【问题描述】:

我有一个基于 MVVM 的 WPF 桌面应用程序。 我正在利用 MVVMLight 和 Prism 创建包含视图和子视图的用户控件。

我在子视图上有按钮。 (假设它是一个关闭按钮)

将单击事件通知从嵌套子视图传播到包含父视图的最佳方式是什么?

【问题讨论】:

标签: .net wpf mvvm prism mvvm-light


【解决方案1】:

使用 Prism EventAggregator。

1.制作您要发布的活动

public class CloseTabEvent : PubSubEvent<TPayload>
    {

    }

TPayload 是您传递的类型(int, string, or even class object

2. 在您的关闭按钮所在的子视图中,发布该事件。 在您的关闭按钮命令(执行方法)中,您发布该事件。

private void OnCloseExecuted(object obj)
{
_eventAggregator.GetEvent<CloseTabEvent>().Publish(SomethingThatYouPublis..ThisIsTPayload);
}

在您的 subView 构造函数中传递 IEventAggregator 并创建一个私有字段。

private IEventAggregator _eventAggregator;
public SubViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
}

3. 在您的 mainViewModel 中,您还可以传递 IEventAggregator 并在构造函数中订阅。

public MainViewModel((IEventAggregator eventAggregator)
{
    eventAggregator.GetEvent<CloseTabEvent>
   ().Subscribe(MethodForClosingThatSpecificTab);
}

就是这样。

重要提示:当使用一些 IoC(Unity, Autofac..) 解析 IEventAggregator 时,使其成为单例,因此它适用于整个应用程序。

【讨论】:

    【解决方案2】:

    子视图可以使用 Prism 中的 EventAggregator 或 MvvmLight 中的 Messenger 类来发送父视图(或视图模型)订阅的消息。有关该概念的更多信息,请参阅以下链接。

    https://msdn.microsoft.com/en-us/magazine/jj694937.aspx http://dotnetpattern.com/mvvm-light-messenger https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/

    另一种方法是保持父视图模型对子视图模型的强引用,并在子视图模型中引发父视图模型订阅的事件。

    使用事件聚合器或信使的好处是,您可以避免在事件发布者和订阅者之间引入紧密耦合,这将使应用程序更易于维护。

    事件或消息的发布者和订阅者都只知道事件聚合器或信使,但他们对彼此一无所知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      相关资源
      最近更新 更多