WPF框架Prism中使用MVVM架構(gòu)
常見的MVVM框架
眾所周知, 如果你了解WPF當(dāng)中的ICommand, INotifyPropertyChanged的作用, 就會發(fā)現(xiàn)眾多框架都是基于這些進(jìn)行擴(kuò)展, 實(shí)現(xiàn)其通知、綁定、命令等功能。
對于不同的MVVM框架而言, 大體使用上會在聲明方式上的差異, 以及特定功能上的差別。
下面列舉了常用的3個(gè)MVVM框架,他們的一些差異。如下所示:
| 功能↓ / →框架名 | Prism | Mvvmlight | Micorosoft.Toolkit.Mvvm |
| 通知 | BindableBase | ViewModelBase | ObservableObject |
| 命令 | DelegateCommand | RelayCommand | Async/RelayCommand |
| 聚合器 | IEventAggregator | IMessenger | IMessenger |
| 模塊化 | √ | × | × |
| 容器 | √ | × | × |
| 依賴注入 | √ | × | × |
| 導(dǎo)航 | √ | × | × |
| 對話 | √ | × | × |
正如你所見, 各個(gè)框架之間都有各自的通知、綁定、事件聚合器等基礎(chǔ)的功能, 而Prsim自帶的依賴注入、容器、以及導(dǎo)航會話等功能, 可以為你提供更加強(qiáng)大的功能。
當(dāng)然,在實(shí)際的開發(fā)過程當(dāng)中, 可以根據(jù)實(shí)際的功能需求, 對不同的框架選型, 同時(shí)這也需要你對各個(gè)框架之間的優(yōu)缺點(diǎn)進(jìn)行判斷。
那么, 下面將主要介紹Prism當(dāng)中的通知、綁定等功能。
BindableBase
如果在此之前, 你用類型mvvmlight框架, ViewModel繼承的類如下:
public class TestViewModel : ViewModelBase
{
private string _message;
public string Message
{
get { return _message; }
set { _message = value; RaisePropertyChanged(); }
}
}在Prism當(dāng)中, 你需要繼承于BindableBase, 如下所示:
public class TestViewModel : BindableBase
{
private string _message;
public string Message
{
get { return _message; }
set { _message = value; RaisePropertyChanged(); }
}
}Command
在mvvmlight/microsoft.toolkit.mvvm中, 聲明Command,如下:
public class TestViewModel : ViewModelBase
{
public RelayCommand SendCommand { get; set; }
public RelayCommand<string> SendMessageCommand { get; set; }
}在Prism當(dāng)中, 你可以使用DelegateCommand及帶參數(shù)的Command, 如下:
public class TestViewModel : ViewModelBase
{
public DelegateCommand SendCommand { get; set; }
public DelegateCommand<string> SendMessageCommand { get; set; }
}CompositeCommand
對于單個(gè)Command而言, 只是觸發(fā)單個(gè)對應(yīng)的功能, 而復(fù)合命令是Prism當(dāng)中非常強(qiáng)大的功能, CompositeCommand簡單來說是一個(gè)父命令, 它可以注冊N個(gè)子命令, 如下所示:

當(dāng)父命令被激活, 它將觸發(fā)對所有的子命令, 如果任意一個(gè)命令CanExecute=false,它將無法被激活,如下所示:

IEventAggregator
- 松耦合基于事件通訊
- 多個(gè)發(fā)布者和訂閱者
- 微弱的事件
- 過濾事件
- 傳遞參數(shù)
- 取消訂閱
該功能主要作用為, 事件聚合器負(fù)責(zé)接收訂閱以及發(fā)布消息。訂閱者可以接收到發(fā)布者發(fā)送的內(nèi)容。
例如: AViewModel訂閱了一個(gè)消息接收的事件, 然后BViewModel當(dāng)中給指定該事件推送消息,此時(shí)AViewModel接收BViewModel推送的內(nèi)容。如下所示:

示例,下面演示如何創(chuàng)建訂閱及發(fā)布:
//創(chuàng)建事件
public class SavedEvent : PubSubEvent<string> { }
//發(fā)布
IEventAggregator.GetEvent<SavedEvent>().Publish("some value");
//訂閱
IEventAggregator.GetEvent<SavedEvent>().Subscribe(.Subscribe(message=>
{
//do something
});Filtering Events
在實(shí)際的開發(fā)過程當(dāng)中,我們往往會在多個(gè)位置訂閱一個(gè)事件, 但是對于訂閱者而言, 他并不需要接收任何消息, 如下所示:

在Prism當(dāng)中, 我們可以指定為事件指定過濾條件, 如下所示:
eventAggregator.GetEvent<MessageSentEvent>()
.Subscribe(arg =>
{
//do something
},
ThreadOption.PublisherThread,
false,
//設(shè)置條件為token等于“MessageListViewModel” 則接收消息
message => message.token.Equals(nameof(MessageListViewModel)));關(guān)于Subscribe當(dāng)中的4個(gè)參數(shù), 詳解:
- 1.action: 發(fā)布事件時(shí)執(zhí)行的委托。
- 2.ThreadOption枚舉: 指定在哪個(gè)線程上接收委托回調(diào)。
- 3.keepSubscriberReferenceAlive: 如果為true,則Prism.Events.PubSubEvent保留對訂閱者的引用因此它不會收集垃圾。
- 4.filter: 進(jìn)行篩選以評估訂閱者是否應(yīng)接收事件。
Unsubscribe
為注冊的消息取消訂閱, Prism提供二種方式取消訂閱,如下:
1.通過委托的方式取消訂閱
var event = IEventAggregator.GetEvent<MessageSentEvent>(); event.Subscribe(OnMessageReceived); event.Unsubscribe(OnMessageReceived);
2.通過獲取訂閱者token取消訂閱
var _event = eventAggregator.GetEvent<MessageSentEvent>(); var token = _event.Subscribe(OnMessageReceived); _event.Unsubscribe(token);
到此這篇關(guān)于WPF框架Prism中使用MVVM架構(gòu)的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET性能優(yōu)化之讓瀏覽器緩存動態(tài)網(wǎng)頁的方法
上一篇《ASP.NET性能優(yōu)化之構(gòu)建自定義文件緩存》我們通過OutputCache,讓請求去訪問服務(wù)器asp.net的輸出緩存,我們擴(kuò)展了OutputCacheProvider,這相當(dāng)于是訪問服務(wù)器上的靜態(tài)資源。2011-09-09
asp.net 動態(tài)生成rdlc報(bào)表(原創(chuàng))
因?yàn)楣拘枨?研究微軟的Reportviewer 因?yàn)橛性S多特別要求所以動態(tài)調(diào)用 比較靈活 我的需求是 根據(jù)數(shù)據(jù)不同的合并表頭 (參考了隨心所欲的博客文檔 再次表示感謝)2011-12-12
asp.net中“從客戶端中檢測到有潛在危險(xiǎn)的Request.Form值”錯誤的解決辦法
這篇文章主要介紹了asp.net中“從客戶端中檢測到有潛在危險(xiǎn)的Request.Form值”錯誤的解決辦法,需要的朋友可以參考下2015-11-11
詳解.Net Core + Angular2 環(huán)境搭建
這篇文章主要介紹了詳解.Net Core + Angular2 環(huán)境搭建,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12
使用Visual Studio 2017作為Linux C++開發(fā)工具
這篇文章主要為大家詳細(xì)介紹了使用Visual Studio 2017作為Linux C++開發(fā)工具的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
ASP.NET Core中實(shí)現(xiàn)用戶登錄驗(yàn)證的最低配置示例代碼
最近工作中遇到一個(gè)需求,需要在ASP.NET Core中來實(shí)現(xiàn)一個(gè)基礎(chǔ)的身份認(rèn)證,下面這篇文章主要給大家介紹了關(guān)于ASP.NET Core中實(shí)現(xiàn)用戶登錄驗(yàn)證的最低配置的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10
ASP.NET使用AjaxPro實(shí)現(xiàn)前端跟后臺交互詳解
這篇文章主要為大家詳細(xì)介紹了ASP.NET使用AjaxPro實(shí)現(xiàn)前端跟后臺交互,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Asp.net 文件上傳類(取得文件后綴名,保存文件,加入文字水印)
Asp.net 取得文件后綴名,保存文件,加入文字水印的代碼類2008-11-11

