架構-MVVM:MVVM核心概念


ylbtech-架構-MVVM:MVVM核心概念

 

1.返回頂部
1、

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接口來表達,基本就是這么個意思:

publicinterface IView
{
 IViewModel ViewModel { get; set; }
}
 
publicinterface IViewModel
{
 IModel Model { get; set; }
 
 ///<summary>
 /// a property that states the controller is busy doing something (like fetching data from a service),
 /// usually the iterface should be blocked
 ///</summary>
 bool IsBusy { get; }
}

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未示例)

https://www.codeproject.com/Articles/126171/MVVM-Silverlight-Simplified

有關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

2、
2.返回頂部
 
3.返回頂部
 
4.返回頂部
 
5.返回頂部
 
 
6.返回頂部
 
warn 作者:ylbtech
出處:http://ylbtech.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM