如何在MVVM WPF应用程序中通知子视图事件的父视图?

时间:2017-04-18 21:31:34

标签: .net wpf mvvm prism mvvm-light

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

我在儿童视图上有按钮。 (假设这是一个关闭按钮)

将嵌套子视图中的click事件通知传播到包含父视图的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

子视图可以使用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/

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

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

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

答案 1 :(得分:0)

使用Prism EventAggregator。

1。制作您要发布的活动

getHeight()

其中public class CloseTabEvent : PubSubEvent<TPayload> { } 是您传递的类型(TPayload

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

int, string, or even class object

在你的subView构造函数中传递private void OnCloseExecuted(object obj) { _eventAggregator.GetEvent<CloseTabEvent>().Publish(SomethingThatYouPublis..ThisIsTPayload); } 并创建一个私有字段。

IEventAggregator

3. 在您的mainViewModel中,您还传递private IEventAggregator _eventAggregator; public SubViewModel(IEventAggregator eventAggregator) { _eventAggregator = eventAggregator; } 并在构造函数内部进行订阅。

IEventAggregator

就是这样。

重要提示:使用某些IoC(Unity,Autofac ..)解析public MainViewModel((IEventAggregator eventAggregator) { eventAggregator.GetEvent<CloseTabEvent> ().Subscribe(MethodForClosingThatSpecificTab); } 时,请将其设为单身,因此它适用于整个应用。

相关问题