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