2017-04-18 43 views
1

我有一個基於MVVM的WPF桌面應用程序。 我正在使用MVVMLight和Prism來創建包含視圖和子視圖的用戶控件。如何在MVVM WPF應用程序中通知子視圖事件的父視圖?

我有一個子視圖按鈕。 (假設這是一個關閉按鈕)

傳播click事件通知從嵌套子視圖直到它包含父視圖的最佳方式是什麼?

+0

查看Prism事件聚合器:http://prismlibrary.readthedocs.io/en/latest/WPF/09-Communication/#event-aggregation –

回答

0

使用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); 
} 

在你的子視圖構造函數中傳遞IEventAggregator並做成一個私有字段。

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

在你mainViewModel你傳遞IEventAggregator和訂閱內部構造。

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

就是這樣。

重要:在解決IEventAggregator與一些IOC(團結,Autofac ..),使其單身,所以這是一個爲整個應用程序。

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/

另一種方法是保持強引用從父視圖模型子視圖模式,提高在父訂閱到孩子的事件。

使用事件聚合器或信使的好處是避免在事件的發佈者和訂閱者之間引入緊密的耦合,這會使應用程序更容易維護。

事件或消息的發佈者和訂閱者都只知道事件聚合器或消息傳遞者,但他們彼此不知道任何事情。

相關問題