天天看點

WPF---Binding學習(一)轉自:http://blog.csdn.net/lisenyang/article/details/18312199

轉自:http://blog.csdn.net/lisenyang/article/details/18312199

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兩部分會占去一部分算法,搞不好還會牽扯不少精力。

問題的根源在于邏輯層和展示層的地位不固定------當實作客戶需求的時候,邏輯層的确處于核心地位。但到了實作UI的時候,展示層又處于核心的地位。WPF作為一種專業的展示層技術,華麗的外觀和動畫隻是它的表層現象,最重要的是他在深層次上把程式員的思維固定在了邏輯層,讓展示層永遠處于邏輯層的從屬地位。WPF具有這種能力的關鍵在于它引入了Data Binding概念及與之配套的Dependency Property系統和DataTemplate。

從傳統的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直接測試業務邏輯罷了。