我有一个基于MVVM的WPF桌面应用程序。 我正在利用MVVMLight和Prism来创建包含视图和子视图的用户控件。
我在儿童视图上有按钮。 (假设这是一个关闭按钮)
将嵌套子视图中的click事件通知传播到包含父视图的最佳方法是什么?
答案 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);
}
时,请将其设为单身,因此它适用于整个应用。