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