1,Data Binding在WPF中的地位程序員
程序的本質是數據+算法。數據會在存儲、邏輯和界面三層之間流通,因此站在數據的角度上來看,這三層都很重要。但算法在3層中的分佈是不均勻的,對於一個3層結構的程序來講,算法通常分佈在這幾處:算法
A。數據庫內部。數據庫
B。讀取和寫回數據。工具
C。業務邏輯。單元測試
D。數據展現。測試
E。界面與邏輯的交互。優化
A,B兩部分的算法通常都很是穩定,不會輕易去改動,複用性也很高;C處與客戶需求最緊密,最複雜,變化最大,大多少算法都集中在這裏。D,E負責UI和邏輯的交互,也佔有必定量的算法。動畫
顯然,C部分是程序的核心,是開發的重中之重,因此咱們應該把精力集中在C部分。然而,D,E兩部分卻常常成爲麻煩的來源。首先這兩部分都與邏輯緊密相關,一不當心就有可能把原本該放在邏輯層裏面的算法寫進這兩部分(因此纔有了MVC、MVP等模式來避免這種狀況出現)。其次,這兩部分以消息或者事件的方式與邏輯層溝通,一旦出現同一個數據須要在多出展現/修改時,用於同步的代碼錯綜複雜;最後,D和E原本是互逆的一對兒。但卻須要分開來寫-----顯示數據寫一個算法,修改數據再寫一個算法。總之致使的結果就是D和E兩部分會佔去一部分算法,搞很差還會牽扯很多精力。.net
問題的根源在於邏輯層和展現層的地位不固定------當實現客戶需求的時候,邏輯層的確處於核心地位。但到了實現UI的時候,展現層又處於核心的地位。WPF做爲一種專業的展現層技術,華麗的外觀和動畫只是它的表層現象,最重要的是他在深層次上把程序員的思惟固定在了邏輯層,讓展現層永遠處於邏輯層的從屬地位。WPF具備這種能力的關鍵在於它引入了Data Binding概念及與之配套的Dependency Property系統和DataTemplate。orm
從傳統的Winform轉移到WPF上,對於一個三層程序而言,數據存儲層由數據庫和文件系統組成,數據傳輸和處理仍然使用.NetFramework的ADO.NET等基本類(與Winform開發同樣)。展現層則使用WPF類庫來實現,而展現層和邏輯層的溝通就使用Data Binding來實現。可見,Data Binding在WPF中所起的做用就是高速公路的做用。有了這條高速公路,加工好的數據自動送達用戶界面並加以顯示,被用戶修改過的數據也會自動傳回業務邏輯層,一旦數據被加工好又會被送往界面。。。。程序的邏輯層就像是一個強有力的引擎一直在運做,用加工好的數據驅動用戶界面也文字、圖形、動畫等形式把數據顯示出來------這就是數據驅動UI。
引入Data Binding以後,D,E兩部分被簡化了不少。首先,數據在邏輯層和用戶界面直來之去、不涉及邏輯問題,這樣的用戶界面部分基本上不包含算法:Data Binding自己就是雙向通訊,因此至關於把D和E合二爲一;對於多個UI元素關注同一個數據的狀況,只須要用Data Binding將這些UI元素和數據一一關聯上(以數據爲中心的星形結構),當數據變化後,這些UI元素會同步顯示這一變化。前面提到的問題也都迎刃而解了。更重要的是通過這樣的優化,全部與業務邏輯相關的算法都處在業務邏輯層,邏輯層成了一個能夠獨立運轉,完整的體系,而用戶界面則不須要任何邏輯代碼。徹底依賴和從屬於業務邏輯層。這樣作有兩個顯而易見的好處,第一:若是把UI看作是應用程序的皮,把存儲層和邏輯層看做是程序的瓤,咱們能夠很輕易的把皮撕下來換一個新的。第二:由於數據層可以獨立運做,自成體系,因此咱們能夠進行更完善的單元測試而無需藉助UI自動化測試工具----你徹底能夠把單元測試看做是一個「看不見的UI」,單元測試只是使用這個UI繞過真實的UI直接測試業務邏輯罷了。