1. 程式人生 > >MVVM架構模式 入門(三)MVVM核心概念

MVVM架構模式 入門(三)MVVM核心概念

轉:https://www.cnblogs.com/iammackong/articles/3312565.html

MVVM核心概念

MVVM模式是Model、View、ViewModel的簡稱,最早出現在WPF,現在Silverlight中也使用該模式,MVVM模式是對MVC模式的變種。哪兒變了?我認為MVVM和MVC的主要變化在於MVVM更適合於XAML。

2011-05-03 14h43_20

MVVM模式和MVC模式一樣,主要目的是分離檢視(View)和模型(Model),有幾大好處

1. 低耦合。檢視(View)可以獨立於Model變化和修改,一個ViewModel可以繫結到不同的"View"上,當View變化的時候Model不可以不變,當Model變化的時候View也可以不變。

2. 可重用性。你可以把一些檢視邏輯放在一個ViewModel裡面,讓很多view重用這段檢視邏輯。

3. 獨立開發。開發人員可以專注於業務邏輯和資料的開發(ViewModel),設計人員可以專注於頁面設計,使用Expression Blend可以很容易設計介面並生成xaml程式碼。

4. 可測試。介面素來是比較難於測試的,而現在測試可以針對ViewModel來寫。

mvvm 2011-07-02 15h23_34

如果用Interface介面來表達,基本就是這麼個意思:

複製程式碼

複製程式碼

1 publicinterface IView
2 {
3 IViewModel ViewModel { get; set; }
4 }

6  publicinterface IViewModel
7 {
8 IModel Model { get; set; }

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_1

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
  • 2011-07-02 15h21_12

3. Model

  • 資料和業務邏輯
  • 客戶端領域模型
  • 由data entities, business objects, repositories and services構成
  • 可以實現屬性或集合的change notification
  • 可以實現validation 介面例如 IDataErrorInfo

MVVM

View和ViewModel主要通過資料繫結和Command/Behavior進行互動,如下圖所示:

2011-05-03 10h24_31

一個例子並且附程式碼下載(Command未示例)

有關Model(模型)和DTO的問題

2011-05-03 17h33_31

前面說的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等等,個人認為不太合適,可以參考這篇文章),此外,參考這篇文章:《WCF RIA Services and a guide to use DTO/”Presentation Model”

DataFlow

程式碼例:

複製程式碼

複製程式碼

publicpartialclass MyModelsEntities : ObjectContext
{



}

[EdmEntityTypeAttribute(NamespaceName="MyModels", Name="MyEntity")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
publicpartialclass MyEntity: EntityObject
{



}

複製程式碼

複製程式碼

MVVM的實踐要點

1. View分離要徹底,不要有壞味道

檢視(view)部分,xaml.cs 應該只有很少的程式碼或沒有程式碼,如果你的xaml.cs包含大量的程式碼,那麼很可能你MVVM用的不對頭,需要檢查其中程式碼的壞味道。Xaml和xaml.cs 只能包含處理介面、檢視、顯示樣式、檢視元素之間的互動、檢視元素動畫,等等的內容

2. ViewModel要可測試

從重構的觀點看,如果你的程式碼中ViewModel是可測試的,有詳細的單元測試Unit Test,你的程式碼是OK的,否則需要檢查其中的壞味道。

MVVM Basic

更多MVVM的內容且看下回分解。(附:本例子且附程式碼下載(Command未示例),channel9有一個MVVM的視訊很好,PPT和視訊演示的原始碼