前面介紹了WPF的基本概念和一些相關知識,咱們瞭解到開發WPF應用程序可使用現成的框架和模式,最爲合適的莫過於時下正熱的MVVM模式,因此這裏咱們也列出針對MVVM模式的已有開源框架:html
圖3設計模式
上面除了WPFToolKit和MEF以外都是一些經常使用的MVVM框架,連帶本身開發的一共是八個,因此本身也取了一個響亮的名字——MVVM 八大框架!聖殿騎士本人實際項目中只用到了三個框架,以前WPF使用過MVVM Helpers,在Silverlight項目當中用過MVVMLight+MEF,後來就一直使用本身開發的框架,其餘框架也研究了很長時間,但都是爲了開發MVVM框架借鑑之用。框架雖然衆多,但萬變不離其宗,通用功能以下:多線程
1,Model、View 和 ViewModel之間的關係:View和ViewModel如何關聯起來(IOC)以及如何通訊(一般採用Message),ViewModel和Model之間的弱關聯(一般採用接口或者簡單注入)。架構
2,事件驅動模式在MVVM模式採用Command和Attached Behaviors的形式。app
3,屬性及ViewModel的NotifyPropertyChanged處理。框架
4,提供完整的單元測試,這也是保證框架的穩定性和維護性的保證。異步
也許有一些朋友會問我爲何要研究這麼多框架,其實作項目只須要認真研究並實踐其中一個就行,研究它們的緣由則主要歸功於本身開發MVVM框架的須要。下面就讓咱們來看一下具體有哪些MVVM的開源框架(具體到每個框架後面有時間再闡述,一篇文章寫得確實很累):mvvm
下載地址:http://compositewpf.codeplex.com/wordpress
開發者:微軟patterns & practices團隊佈局
是否支持Silverlight:是
學習資料:Composite Application Guidance for WPF and Silverlight - May 2010.chm以及Quickstarts和StockTraderRI等。
源碼截圖以下:
圖4
Prism——以前又叫Composite Application Guidance for WPF and Silverlight,它是構建複雜的基於WPF/Silverlight企業級應用的主流框架。Prism中有幾個比較重要的概念:
1,BootStrapper:應用程序切入點,繼承Prism的UnityContainer或MEF提供的MefUnityContainer,爲系統提供一個容器。
2,Shell:它是一個外殼,經過UI元素和Region佈局頁面。 它是應用程序的頂級窗口,顯示的內容通常就由View來填充,Shell自己並不知道它包含了哪些內容,因此功能則是由各個Module來具體提供。
3,View:它等同於MVP模式、MVVM模式中的View。能夠經過IRegionManager注入到Region中。
4,Module:能夠把一個大項目拆分開來,每個Module都包含View、數據、模型,主要用於實現複雜業務操做。
5,IModuleManager:主要用於管理模塊加載,能夠實現動態加載。
6,IEventAggregator:事件處理接口,實現訂閱和發佈模式,這也是MVVM框架的通常作法。
Prism是一個比較龐大的組合框架,4.0引入MEF及功能調整之後變得更增強大了,如今能夠說是組合框架和應用框架的統一體,並且是微軟團隊的力量,因此選它是值得保證的。
下載地址:http://caliburn.codeplex.com/
開發者:Rob Eisenberg
是否支持Silverlight:是
學習資料:我主要參考項目實例、源碼、單元測試用例、國外一些博客和社區。
源碼截圖以下:
圖5
Caliburn中有幾個比較重要的概念:
1,在Actions基礎上的Commands帶有不少功能,其中包括多參數、過濾操做以及異步調用。
2,窗體和控件的生命週期事件也處理得比較好(包括activation、deactivation、shutdown等)。
3,不論是整個框架仍是基於這個框架的應用程序的可測性都比較好。
4,提供了不少經常使用功能,這些在項目當中都比較有用。
5,除了支持MVVM模式以外,還很好的支持MVP模式以及其餘的一些變種模式。
6,強大的依賴注入框架以及AOP框架,這裏能夠靈活選用其中一種。
Caliburn是一個很是強大的MVVM應用框架,對不少功能都提供了靈活且多種實現,不管是項目使用仍是研究代碼,感受都受益頗多。
下載地址:http://mvvmlight.codeplex.com/
開發者:Laurent Bugnion
是否支持Silverlight:是
學習資料:除了online documentation,我主要參考項目實例、源碼、單元測試用例、國外一些博客和社區。另外這三篇文章很是不錯,用MVVMLight開發了一個比較完整的Silverlight企業項目
源碼截圖以下:
圖6
MVVMLight中有幾個比較重要的概念:
1,RelayCommand:經過對Command進行封裝,使得MVVM模式在WPF和Silverlight上更加容易。你只須要在 ViewModel中定義好各個RelayCommand,而後在View中經過Command來綁定ViewModel中定義好的 RelayCommand,就能夠實現像WinForm、ASP.NET事件同樣的效果,只不過這裏是解除了UI和邏輯的強耦合。
2,Messager:MVVMLight中的Messager做用比較大,前面講了MVVM模式解除了ViewModel和View的強引用,那麼它們如何來進行交互呢?就是靠它來讓ViewModel和View來進行通訊的。通常咱們會定義一個靜態AppMessages類來做爲通用的一個通訊類,原理就是發佈訂閱模式。
3,EventToCommand:這裏就比較相似於附加行爲的概念,是在MVVM Light Toolkit V3中開始引入的概念。
4,ICleanup接口:當顯示某個View時,須要先調用Cleanup方法清除數據,這也是因爲ViewModel和View的耦合隔離產生的一些必要操做。
MVVMLight是一個很是好用的MVVM框架,提供了VS和Blend的模板及智能感知。它結合MEF使用真的感受很輕量級且高效,並且提供了WPF和Silverlight的支持,尤爲在Silverlight的支持上比較好,因此通常選擇輕量級的Silverlight MVVM模式,它比較被看好。
下載地址:http://mvvmhelpers.codeplex.com/
開發者:Mark Smith
是否支持Silverlight:否
學習資料:http://www.julmar.com/blog/mark/以及提供的實例、源碼及測試用例。
源碼截圖以下:
圖7
MVVM Helpers又叫JulMar MVVM Helpers + Behaviors,其中有幾個比較重要的概念:
1,提供了MVVM模式的基本功能,包括ViewModel、View及Model之間的隔離,另外還提供了一些經常使用功能。
2,ViewModel的建立使用標籤的形式注入,如今也能夠引入MEF。
3,IOC/DI的支持,屬性都有驗證機制,Wait Cursor的支持,當使用完viewmodel以後能及時釋放,這樣避免內存泄露。
4,提供了經常使用的Attached Behaviors支持。
5,消息機制的引入,避免強引用產生的耦合。
MVVM Helpers是一個很是適用的MVVM框架,尤爲是提供了MVVM經常使用功能+MEF+Attached Behaviors,因此項目中的問題基本都能解決。
下載地址:http://cinch.codeplex.com/
開發者:Sacha Barber
是否支持Silverlight:否
學習資料:http://sachabarber.net/以及提供的實例、源碼及測試用例。
源碼截圖以下:
圖8
若是仔細研究其代碼,你會發現它和上面講的MVVM Helpers有不少類似的代碼,估計是相互參考了一番:-D。Cinch 中有幾個比較重要的概念:
1,這個框架在沒有MEF出現以前就已經實現了ViewModel和View之間的強引用隔離,它既沒有通常IOC的配置,也沒有IView來作中轉,而且窗體和控件的生命週期事件也處理得比較好,因此在這方面來講是很是不錯的。
2,提供了經常使用的Attached Behaviors支持,另外也提供了一些MVVM經常使用功能。
3,DI/IOC使用Unity實現,多線程的實現,避免系統出現不可預料的錯誤。
4,當使用完viewmodel以後能及時釋放,這樣避免內存泄露,驗證機制的加入,經常使用導航實現。
5,消息機制的引入,避免強引用產生的耦合。
Cinch 是一個很是強大的框架,尤爲是它比較着眼整個應用程序的搭建,因此也比較受到青睞。
下載地址:http://mvvmfoundation.codeplex.com/
開發者:Josh Smith
是否支持Silverlight:否
學習資料:http://joshsmithonwpf.wordpress.com/以及提供的實例、源碼及測試用例。
源碼截圖以下:
圖9
MVVMFoundation中有幾個比較重要的概念:
1,Messenger:這裏主要用在各類不一樣的ViewModel之間通訊(好比相互關聯的ViewModel、主從ViewModel等),固然也能夠擴展成ViewModel與View之間進行通訊。
2,ObservableObject:這裏至關於ViewModelBase的概念,每個ViewModel繼承自該類,調用完成以後當即釋放,防止內存泄露。
3,PropertyObserver:主要是對INotifyPropertyChanged.PropertyChanged進行封裝,這樣封裝能夠精簡代碼,同時能夠防止不當操做引發的內存泄露。
4,RelayCommand接口:封裝command的聲明,包括execution執行邏輯,可選的can-execute邏輯等。外部只須要實例化並Binding就能夠簡單使用。
MVVMFoundation是一個很是簡單的MVVM框架,若是你以爲研究源碼比較困難,就能夠先從這個框架入手,代碼簡單並且精煉。
源碼截圖以下:
圖10
上面咱們已經介紹了七大MVVM框架+支持插件式的依賴注入MEF,其實另外這三個框架WPF Application Framework (WAF)、Calcium、CoreMVVM(Basic MVVM framework)也很值得研究,因爲時間和精力的關係,針對這三個框架聖殿騎士也沒有進行仔細的剖析,只是粗略看了一下基本功能。
其餘一些框架諸如Onyx、nRoute、Nito MVVM、Ocean、GoodLight就沒有太多關注,有興趣的朋友也能夠選擇其中某一個或多個框架做爲研究和學習,不過仍是推薦研究主流的框架,畢竟這些主流框架的開發團隊和成熟度都比較強。
上面看到了這麼多MVVM框架,那麼咱們應該怎麼去學習和使用呢?簡單來講能夠概括爲如下幾句話:
1,根據具體的項目選擇適合的框架,團隊和項目有大有小,因此得根據這些來選擇具體的框架,其實終歸來講,幾個框架功能都比較相似。
2,框架不用研究太多,只要適用於項目就行,尤爲是熟練使用並根據其提供的TDD測試代碼追溯其原理。
3,框架不是萬能的,對於某些應用和功能能夠對框架擴展,這也開源最大的好處之一。
針對框架的研究,本身也總結了幾點:
1,首先看框架的相關介紹,瞭解相關的背景、功能、架構圖以及其餘一些相關信息——認識瞭解。
2,根據介紹查看並調試框架所提供的實例——熟悉功能。
3,本身寫一些相關的項目,主要是熟悉該框架,若是說要急於作項目,後面就能夠把框架引入到項目當中——具體使用。
4,根據該框架提供的詳細單元測試研究其源碼,這也是我最喜歡研究這些開源框架的緣由——原理剖析。
5,經過上面的步驟認真分析其原理及細節——準備重現。
6,本身也根據以前的思路重複開發這個框架,最好能用TDD——框架復原捷徑。
上面咱們談了一些開源框架相關知識,下一步咱們得本身開發一個MVVM框架,一方面是對知識的總結,另外一方面也是對知識的再提煉,同時也能使本身的認識提高到另外一個高度,緊接下文。
因爲以前本身作了一套框架,可是尚未趨於完善,因此暫時不許備共享出來(主要是WPF和Silverlight版本更替比較頻繁且沒有加入模板及智能感知)。對於開發一套MVVM框架,具體須要作一下幾個操做:
1,要能解決Model、View和ViewModel之間的強關聯,這也是核心功能,尤爲是View和ViewModel,不論是使用IOC Container仍是MEF都行。
2,命令和附加事件的處理,對Command進行封裝,知足多參數、方法過濾、泛型、異步回調等,對附加事件進行封裝,使它像使用命令同樣簡便。
3,因爲View和ViewModel是弱關聯或者是無關聯,如何讓它們進行通訊?這就須要加入Messenger機制。
4,前面引入了消息機制(通常是靜態化處理),如何來管理、實例化、清除消息呢?這裏得創建一套消息機制。
5,因爲前面採用了弱關聯或者無關聯,而且引入了消息機制,因此須要對操做有日誌記錄,不然出了問題沒法快速定位及追查緣由。
6,如何統一管理ObservableObject、PropertyObserver等這些對象呢?因此得本身創建一套變動體系。
7,對經常使用功能及操做進行封裝,提供一些經常使用類庫以及UI Helper等。
總之,開發MVVM框架不能求全,只要適合項目就行,也不要想一次就能完善整個框架,在使用時不斷根據需求擴展才是明智之舉。另外附加三點開發MVVM框架心得:
1,充分借鑑其餘開源框架,研究各個框架的不足和優點,而後把思想貫穿於本身的框架中,固然有些經常使用功能代碼也能夠直接借鑑過來。
2,對於這樣一個比較龐大的框架,使用TDD+反覆重構無疑會提升開發效率,同時也能提升框架的可維護性和穩定性,這也是團隊使用的一個前提。
3,框架會使用一些經常使用設計模式,有了它們可讓框架更具備擴展性,同時也減小了開發成本、增長了可維護性。好比觀察者模式(消息的發佈、訂閱、觸發)、中介者模式(直接通訊的類轉化爲中間類來處理,隔離耦合)、外觀模式(提供一個簡單的接口出來,在內部進行大量的封裝,這樣就能夠起到易用且功能強大的目的)、裝飾模式(原來已經穩定的功能模塊,若是在不改變原有結構的基礎上進行擴展,無疑這是一個很好的實踐)等。
----------------------------------------------------------------------------------------
如下是各類開源控件,就不介紹了。
Fluent Ribbon Control Suite
Microsoft Ribbon for WPF
AvalonDock
PropertyEditor for WPF
WPF Property Grid
PropertyInspectorView
WPF Dynamic Data Display
Swordfist WPF Charts
WPF Toolkit
AvalonEdit