MVVM Light学习笔记(三):Messenger
本篇介紹MvvmLight中一個(gè)重要的東東,那就是Messenger.
(一)Messenger的基本組成
Messenger類用于應(yīng)用程序的通信,接受者只能接受注冊的消息類型,另外目標(biāo)類型可以被指定,用Send<TMessage, TTarget>(TMessage message)實(shí)現(xiàn),在這種情況下信息只能被傳遞如果接受者類型和目標(biāo)參數(shù)類型匹配,message可以是任何簡單或者復(fù)雜的對象,你可以用特定的消息類型或者創(chuàng)建你自己的類型繼承自他們
(1)MessageBase:簡單的消息類,攜帶可選的信息關(guān)于消息發(fā)布者的
(2)GenericMessage<T>:范型消息
(3)NotificationMessage: 用于發(fā)送一個(gè)string類型通知給接受者
(4)NotificationMessage<T>:和上面一樣是一個(gè),且具有泛型功能。
(5)NotificationMessage:向接受者發(fā)送一個(gè)通知,允許接受者向發(fā)送者回傳消息
(6)NotificationMessageAction<T>:NotificationMessage的泛型方式
(7)DialogMessage:發(fā)送者(通常是View)顯示對話,并且傳遞調(diào)用者得回傳結(jié)果(用于回調(diào)),接受者可以選擇怎樣顯示對話框,可以使是標(biāo)準(zhǔn)的MessageBox也可也是自定義彈出窗口
(8)PropertyChangedMessage<T>:用于廣播一個(gè)屬性的改變在發(fā)送者里,和PropertyChanged事件有完全箱體內(nèi)各的目的,但是是一種弱聯(lián)系方式
(二)Messenger的案例演示。
??? 下面用一個(gè)簡單的列子講解下Messenger的用法,在實(shí)例中,有兩個(gè)窗口,一個(gè)是顯示產(chǎn)品詳細(xì)信息MainWindow.xaml,另一個(gè)是EditDetailView.xaml,通過選擇MainWindow窗口中的任意產(chǎn)品,能在EditDetailView窗口顯示,如果在EiditDetailView中修改產(chǎn)品的數(shù)量,可以將修改的結(jié)果立即呈現(xiàn)到MainWindow中。
?
原理淺析:發(fā)布者通過Messenger.Default.Send<T>發(fā)布某個(gè)類型消息,而接受者通過?Messenger.Default.Register<T>注冊相應(yīng)的消息類型,從而實(shí)現(xiàn)接受消息
主要代碼如下:
發(fā)送者,代碼片段
SelectedProductCommand = new RelayCommand(() =>{
if (Products.CurrentItem != null)
{
//獲取當(dāng)前選中列
Product selectedProduct = (Product)Products.CurrentItem;
//消息的發(fā)送
//(1)如果我們只需要接受者接受消息,用下面的方式就可以了
//發(fā)布消息 另一種寫法Messenger.Default.Send<Product>(selectedProduct);
Messenger.Default.Send(selectedProduct);
//(2)如果我們需要接受者返回消息,還需要下面的代碼
//發(fā)布消息,接受者可以通過NotificationMessageAction<Product> 的實(shí)例lastProduct的Excute()方法返回消息到接受者
Messenger.Default.Send(new NotificationMessageAction<Product>("當(dāng)前選擇的產(chǎn)品是:" + selectedProduct.Description, FromEditViewModelCallBack));
}
}
);
接受者,主要代碼片段
public EditDetailViewModel(){
//消息的接受
//(1)如果我們只是接受消息,不返回消息,只需要下面的代碼
Messenger.Default.Register<Product>(this, m => FromMainWindowProduct= m);
//(2)如果我們還需要向發(fā)送者返回消息,我們需要將如下代碼,獲取 NotificationMessageAction<Product> lastProduct實(shí)例
Messenger.Default.Register<NotificationMessageAction<Product>>
(this, m =>
{
ShowMessage= m.Notification;
lastProduct = m;
}
);
SaveCommand = new RelayCommand(() =>
{
//處理來至發(fā)送者的消息,并返回消息到發(fā)送者
lastProduct.Execute(product);
}
);
}
源代碼下載
轉(zhuǎn)載于:https://www.cnblogs.com/Joetao/articles/2119610.html
總結(jié)
以上是生活随笔為你收集整理的MVVM Light学习笔记(三):Messenger的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Aspx页面生命周期(转)
- 下一篇: 如何理解IIS 7的两种应用程序池的管道