劉慧玲 陳曉軍 王申申
摘要:微軟的Prism開源框架,非常適合作為復雜界面程序的框架庫。該文對Prism庫中的Interaction機制及源碼進行了分析,并結合項目實際情況進行了改進,大大簡化了其實現(xiàn)過程。
關鍵詞:Prism;MVVM
中圖分類號: TP311文獻標識碼:A文章編號:1009-3044(2012)21-5110-03
MVVM是當前最流行的界面開發(fā)模式,尤其在它配合WPF后,功能更強大。但是,由于MVVM是在WPF出現(xiàn)后才發(fā)明的設計模式,WPF對它的支持不夠好。所以,使用MVVM模式開發(fā)項目,在界面交互這些以往很簡單的問題上,往往需要比較復雜的代碼。Prism庫提供了很多的方法來支持MVVM模式。其中的Interaction機制能夠更簡便的處理界面交互問題。本人通過Interaction機制在項目中的實際應用,簡化了它的使用方式。
1 Prism和MVVM介紹
Prism開源框架是由微軟Patterns & Practices團隊所開發(fā),目的在于幫助開發(fā)人員構建松散耦合的、更靈活、更易于維護并且更易于測試的WPF應用或Silverlight應用以及Windows Phone 7應用。使用Prism可以使程序開發(fā)更趨于模塊化,整個項目將由多個離散的、松耦合的模塊組成,而各個模塊又可以又不同的開發(fā)者或團隊進行開發(fā)、測試和部署。
MVVM模式:MVVM模式是專為WPF打造的用于分離界面和程序邏輯的開發(fā)模式。它是MVC的變種。MVC是最早的為大家所熟知的開發(fā)界面程序的模式。但是它并不能完全干凈的分離邏輯和界面代碼。MVVM借助于WPF的binding功能可以滿足這個需求。MVVM是Model-View-ViewModel的簡寫。它把程序分為三層:界面呈現(xiàn)(view),界面邏輯(ViewModel),業(yè)務邏輯和數(shù)據(jù)(Model)。ViewModel用于和View中的控件元素綁定,響應命令及事件處理。
2 MVVM模式中如何實現(xiàn)界面交互
通常一個界面程序在響應事件或執(zhí)行命令前會與用戶有簡單的交互,像是notification或confirmation messagebox。但是在MV VM模式中,這個交互是令人頭痛的。如果你用普通的messagebox,它將會破壞MVVM的規(guī)則(在viewmodel中不應該直接引用控件,這違背了界面和業(yè)務代碼分離的原則)。MVVM模式中,一般有兩種方式來實現(xiàn)這種交互:
方式1.創(chuàng)建一個Service來顯示交互的控件,viewmodel能夠調用這個Service。這樣防止了View和ViewModel的直接引用。
方式2. ViewModel觸發(fā)一個事件,View定制這個事件,來顯示交互的界面。這種方式很好的隔離了界面和邏輯代碼。但是可能創(chuàng)建很多事件,雜亂的放在VIewModel和View兩側,不好管理。
3 Prism庫的Interaction機制
Prism提供了一個Interaction機制實現(xiàn)了這兩種方式。
第一種方式很簡單,Prism提供了InteractionService類。用戶通過Service直接調用交互控件。
第二種方式在View中將一個在ViewModel中聲明的Interaction Request Object和一個Behavior綁定。ViewModel觸發(fā)這個Inter action Request,相應的行為將被執(zhí)行。Interaction Request Object封裝了具體的交互請求,響應函數(shù),并且通過事件與View通信。View訂閱這個事件,并且創(chuàng)建一個Behavior(將被綁定到ViewModel提供的Interaction Request Object)。Prism庫提供了IInteraction Request接口和InteractionRequest
Prism提供了預定義的上下文對象Notification和Confirmation。Notification用于顯示提示信息,只有Title和Content屬性。Confirmation繼承于Notification,增加一個屬性Confirmed。它用于實現(xiàn)MessageBox類型的交互,用于得到用戶的Yes,No的響應。
下面是InteractionRequest
public IInteractionRequest ConfirmCancelInteractionRequest
{
get
return this.confirmCancelInteractionRequest;
}}
this.confirmCancelInteractionRequest.Raise(
new Confirmation("Are you sure you wish to cancel"),
confirmation =>
{
if (confirmation.Confirmed)
{
this.NavigateToQuestionnaireList();
}
});
}
ConfirmCancelInteractionRequest用于View的數(shù)據(jù)綁定。
Interaction Request Object中封裝了交互邏輯,而交互界面定義在View中。這里用Behavior模式來封裝交互界面,它運行開發(fā)者綁定任一種適合的Behavior到Interaction Request Object。Prism庫定義了InteractionRequestTrigger來監(jiān)聽Viewmodel發(fā)出的Inter action Request。當ViewModel調用Raise函數(shù)時,InteractionRequestTrigger將調用指定的行為。Prism庫提供PopupChildWindowAc tion類來顯示交互界面。通過它的ContentTemplate屬性,開發(fā)者可以定制交互界面。下面是xaml文件中相應的代碼:
SourceObject="{Binding ConfirmCancelInteractionRequest}"> ContentTemplate="{StaticResource ConfirmWindowTemplate}"/>