前面文章中,咱們已經知道,WPF技術的主要特色是數據驅動UI,因此在使用WPF技術開發的過程當中是以數據爲核心的,WPF提供了數據綁定機制,當數據發生變化時,WPF會自動發出通知去更新UI。 編程
咱們不論是NET中仍是WPF中使用模式目的就是想達到高內聚低耦合。在WPF開發中,經典的編程模式是MVVM,是爲WPF量身定作的模式,該模式充分利用了WPF的數據綁定機制,最大限度地下降了Xmal文件和CS文件的耦合度,也就是UI顯示和邏輯代碼的耦合度,如須要更換界面時,邏輯代碼修改不多,甚至不用修改。與WinForm開發相比,咱們通常在後置代碼中會使用控件的名字來操做控件的屬性來更新UI,而在WPF中一般是經過數據綁定來更新UI;在響應用戶操做上,WinForm是經過控件的事件來處理,而WPF可使用命令綁定的方式來處理,耦合度將下降。架構
MVVM是Model-View-ViewModel(模型-視圖-視圖模型)的縮寫形式,它一般被用於WPF或Silverlight開發。咱們能夠經過下圖來直觀的理解MVVM模式: 測試
一、View就是用xaml實現的界面,負責與用戶交互,接收用戶輸入,把數據展示給用戶。設計
二、ViewModel是一個C#類,負責收集須要綁定的數據和命令,聚合Model對象,經過View類的DataContext屬性綁定到View,同時也能夠處理一些UI邏輯。3d
三者之間的關係:View對應一個ViewModel,ViewModel能夠聚合N個Model,ViewModel能夠對應多個View對象
MVVM的根本思想就是界面和業務功能進行分離,View的職責就是負責如何顯示數據及發送命令,ViewModel的功能就是如何提供數據和執行命令。各司其職,互不影響。在實際的業務場景中咱們常常會遇到客戶對界面提出建議要求修改,使用MVVM模式開發,當設計的界面不知足客戶時,咱們僅僅只須要對View做修改,不會影響到ViewModel中的功能代碼,減小了犯錯的機會。隨着功能地增長,系統愈來愈複雜,相應地程序中會增長View和ViewModel文件,將複雜的界面分離成局部的View,局部的View對應局部的ViewModel,功能點散落在各個ViewModel中,每一個ViewModel只專一本身職能以內的事情。ViewModel包含了View要顯示的數據,而且知道View的交互代碼,因此ViewModel就像一個無形的View。使用MVVM架構具備如下優點接口
爲了讓你們直觀地瞭解MVVM的編程模式,下面會用到前面講到的數據綁定以及命令等知識。
新建WPF項目,名稱WPFMVVMDemo。添加用戶類,以下圖
在WPF術語中,這個叫「模型」,GUI是「視圖」。難以想象的是「視圖模型」,經過數據綁定將它們綁在一塊兒,它真的是一個很好的適配器能將模型變成某種WPF框架可使用的東西。因此這個就是「模型」。
請注意這個視圖模型不是十分正確的。由於咱們在視圖模型裏暴露了屬性,咱們顯然會想使在代碼裏改變的用戶名和公司名自動的顯示在視圖上
這裏咱們點擊更新按鈕不會有任何反應,由於尚未實現數據綁定。此時視圖不會收到任何的關於屬性改變的通知。要解決這個問題咱們必須實現名稱爲INotifyPropertyChanged的接口。任何實現了這個接口的類,當屬性發生改變的時候會通知全部監聽者,因此咱們須要修改視圖模型NameViewModel類:
這裏會產生多個事件。首先,咱們檢查了咱們是否真的改變了屬性。第二,若是值已經改變,咱們向全部監聽者註冊PropertyChanged事件。如今咱們有了一個模型Name和一個視圖模型NameViewModel。咱們只須要在定義視圖。只須要修改視圖MainWindow:
本文的demo下載地址:WPFMVVMDemo1.zip