我跑進問題,即消息將觸發多次,因爲消息被多次註冊時,在視圖的構造函數被註冊。大部分S.O.的帖子,網站,博客展示一個例子是這樣的:MvvmLight消息 - 註冊和取消註冊消息的正確方法是什麼?
public ConstructorOfView() {
DataContext = viewModelObject;
Messenger.Default.Register<SomeClass>(recipient, token, method);
}
public someUnloadOrNavigateFromMethod() {
Messenger.Default.Unregister<SomeClass>(parameters and more);
}
註銷似乎對我沒有任何影響。一些例子說在ViewModel中註冊消息。這對我來說沒有意義,原因有兩個:1)如果將頁面的DataContext設置爲ViewModel,則ViewModel構造函數會再次被調用兩次,就像視圖構造函數一樣。 2)如果你在ViewModel中註冊了一個消息,你怎麼告訴視圖去激發一個方法,而不是公共靜態的,它顯示一個消息對話框?在視圖模型中調用UI相關元素(如對話框)的第三種選擇似乎違反了MvvM的概念。
什麼是註冊和註銷信息的正確方法?
有些帖子建議讓viewmodel調用Cleanup(),但不知何故你需要註冊消息給viewmodel,但是我不清楚如果你將消息的接收者設置爲viewmodel,viewmodel如何在視圖中調用非公共靜態方法來更改/顯示UI?
感謝您的回覆。有一件事我很困惑。如果在視圖模型中註冊消息,那麼當對話框應該在視圖中處理而不是視圖模型時,如何更改或顯示一塊UI,如同一個對話框?對我來說,在視圖模型中註冊消息是沒有意義的。 – ShrimpCrackers
我理解你的疑問,並以某種方式同意它。事實上,thre是很多解決方案,也是基於您編寫代碼的平臺。假設你正在爲Windows編寫一個wpf應用程序,第一個應用程序可能是:不是mvvm極端主義者,並直接在消息處理程序中調用MessageBox.Show。我有時候會這樣做,它有效,它違反了一些MVVM原則,但可能爲您節省數百行代碼。其次:重新思考如何向用戶顯示消息,並使用綁定到某些UI控件來顯示消息。第三:而不是一個對話框顯示一個新的彈出視圖。 –