Silverlight入门系列]使用MVVM模式(1):MVVM核心概念
MVVM模式是Model、View、ViewModel的簡(jiǎn)稱,最早出現(xiàn)在WPF,現(xiàn)在Silverlight中也使用該模式,MVVM模式是對(duì)MVC模式的變種。哪兒變了?我認(rèn)為MVVM和MVC的主要變化在于MVVM更適合于XAML。
MVVM模式和MVC模式一樣,主要目的是分離視圖(View)和模型(Model),有幾大好處:
1. 低耦合。視圖(View)可以獨(dú)立于Model變化和修改,一個(gè)ViewModel可以綁定到不同的"View"上,當(dāng)View變化的時(shí)候Model不可以不變,當(dāng)Model變化的時(shí)候View也可以不變。
2. 可重用性。你可以把一些視圖邏輯放在一個(gè)ViewModel里面,讓很多view重用這段視圖邏輯。
3. 獨(dú)立開發(fā)。開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(ViewModel),設(shè)計(jì)人員可以專注于頁(yè)面設(shè)計(jì),使用Expression Blend可以很容易設(shè)計(jì)界面并生成xaml代碼。
4. 可測(cè)試。界面素來(lái)是比較難于測(cè)試的,而現(xiàn)在測(cè)試可以針對(duì)ViewModel來(lái)寫。
如果用Interface接口來(lái)表達(dá),基本就是這么個(gè)意思:
1 public interface IView2 {
3 IViewModel ViewModel { get; set; }
4 }
5
6 ?public interface IViewModel
7 {
8 IModel Model { get; set; }
9
10 /// <summary>
11 /// a property that states the controller is busy doing something (like fetching data from a service),
12 /// usually the iterface should be blocked
13 /// </summary>
14 ? bool IsBusy { get; }
15 }
MVVM的Model、View、ViewModel分工
1. View
- 負(fù)責(zé)界面和顯示,界面構(gòu)成元素有window, controls, page, dataTemplete, custom controls….
- 代碼通常有XAML和XAML.CS組成,但后臺(tái)代碼應(yīng)該很少
- 通過(guò)DataContext和ViewModel綁定
- 不直接和Model交互!
- 控件可以和ViewModel的公共屬性綁定,update需要雙向綁定
- 控件可以觸發(fā)Behavior/Command調(diào)用ViewModel的方法,Command是View到ViewModel的單向通訊 (View中觸發(fā)事件,ViewModel中處理事件)
2. ViewModel
- 主要包括界面邏輯和模型數(shù)據(jù)封裝,Behavior/Command事件響應(yīng),綁定的屬性定義等
- ViewModel繼承Model類,或者是Model的繼承類
- 是view和model的橋梁,是對(duì)Model的抽象,例如,model中數(shù)據(jù)格式是“年月日”,可以在viewModel中轉(zhuǎn)換model中的數(shù)據(jù)為“日月年”以供視圖(view)顯示。
- 維護(hù)視圖狀態(tài)
- 實(shí)現(xiàn)屬性或集合的change notification
3. Model
- 數(shù)據(jù)和業(yè)務(wù)邏輯
- 客戶端領(lǐng)域模型
- 由data entities, business objects, repositories and services構(gòu)成
- 可以實(shí)現(xiàn)屬性或集合的change notification
- 可以實(shí)現(xiàn)validation 接口例如 IDataErrorInfo
View和ViewModel主要通過(guò)數(shù)據(jù)綁定和Command/Behavior進(jìn)行交互,如下圖所示:
一個(gè)例子并且附代碼下載(Command未示例)
有關(guān)Model(模型)和DTO的問(wèn)題
前面說(shuō)的Model是客戶端的,但實(shí)際上Domail Model存在服務(wù)器端(靠近數(shù)據(jù)庫(kù))和那就需要和客戶端搞映射DTO(Data Transfer Ojbect,數(shù)據(jù)傳輸對(duì)象,帶序列化標(biāo)記,用來(lái)遠(yuǎn)程調(diào)用)。在Silverlight中有個(gè)很方便的東西來(lái)實(shí)現(xiàn)這個(gè)DTO過(guò)程和序列化,那就是WCF RIA Service和DomainService。如果你創(chuàng)建一個(gè)簡(jiǎn)單的Silverlight應(yīng)用并且調(diào)用WCF RIA Service,基本上會(huì)生成DTO Model: ObjectContext(EntityObject)。(也有人喜歡在Model里面調(diào)用RiaSerivce實(shí)現(xiàn)load,save等等,個(gè)人認(rèn)為不太合適,可以參考這篇文章)
代碼例:
public partial class MyModelsEntities : ObjectContext{
…
}
[EdmEntityTypeAttribute(NamespaceName="MyModels", Name="MyEntity")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class MyEntity: EntityObject
{
…
}
MVVM的實(shí)踐要點(diǎn)
1. View分離要徹底,不要有壞味道
視圖(view)部分,xaml.cs 應(yīng)該只有很少的代碼或沒有代碼,如果你的xaml.cs包含大量的代碼,那么很可能你MVVM用的不對(duì)頭,需要檢查其中代碼的壞味道。Xaml和xaml.cs 只能包含處理界面、視圖、顯示樣式、視圖元素之間的交互、視圖元素動(dòng)畫,等等的內(nèi)容。
2. ViewModel要可測(cè)試
從重構(gòu)的觀點(diǎn)看,如果你的代碼中ViewModel是可測(cè)試的,有詳細(xì)的單元測(cè)試Unit Test,你的代碼是OK的,否則需要檢查其中的壞味道。
更多MVVM的內(nèi)容且看下回分解。(附:本例子且附代碼下載(Command未示例))
作者:Mainz 出處:http://www.cnblogs.com/Mainz轉(zhuǎn)載于:https://www.cnblogs.com/jeriffe/articles/2085765.html
總結(jié)
以上是生活随笔為你收集整理的Silverlight入门系列]使用MVVM模式(1):MVVM核心概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HTML标签strong和em
- 下一篇: 输出stage.displayState