天天看點

依賴屬性之“風雲再起”三八. DependencyObject測試代碼九. DependencyObject實作代碼

在寫DependencyObject測試代碼之前,我們先看一下它到底有哪些成員和方法,如下圖:

<a href="http://images.cnblogs.com/cnblogs_com/KnightsWarrior/WindowsLiveWriter/d1051bd1bd80_136FD/2010-8-26%2018-52-44_2.png"></a>

  通過上面的這幅圖,我們知道它的主要功能包括:各種依賴屬性的GetValue、SetValue操作(核心功能)和ClearValue、 CoerceValue、GetLocalValueEnumerator、ReadLocalValue等操作。為了測試這些功能,我們首先建立幾個 類,第一個類X,内部首先注冊一個附加依賴屬性,我們都知道,不管是附加依賴屬性還是依賴屬性,都需要使用到GetValue和SetValue操作,隻 是一個封裝成了屬性,而另一個封裝成了靜态方法而已。第二個類直接繼承自我們前面在實作DependencyProperty時建立的 DependencyObject原型類。

第三個類則是為了直接測試注冊一個依賴屬性,這個類首先繼承自DependencyObject原型類。

首先我們先寫測試GetValue和SetValue操作的測試代碼,然後不能通過,最後完善DependencyObject類的GetValue和SetValue方法直到測試用例通過。

由于這裡是y1和y2兩個對象,是以他們的GetValue和SetValue也是設定和取得各自的值。

  通過前面的圖,大家可以看到DependencyObject提供了一個取得本地值枚舉器的GetLocalValueEnumerator方法,它實作一個IEnumerator來友善通路LocalValue,這裡我們要實作它,是以先寫測試代碼。

還有幾個功能,既然Mono也沒做研究,我們也就不費那個力氣了,接下來我們就看看剛才實作的DependencyObject代碼吧!

通過前面的測試用例,DependencyObject類的基本功能已經完成,不過我們要注意幾個要點: 

1,依賴屬性其實終究要DependencyObject和DependencyProperty成對才能算得上真正的DependencyProperty

2,不管是Register、RegisterAttached、RegisterAttachedReadOnly還是 RegisterReadOnly操作,我們都要通過DependencyObject來操作DependencyProperty的值,也就是通過 DependencyObject這個外部接口來操作,DependencyProperty隻負責注冊和内部處理,不負責外部接口。

3,在DependencyObject中提供了幾個操作LocalValue的接口的接口,其中包括ReadLocalValue、GetLocalValueEnumerator、CoerceValue和ClearValue等。

4,在注冊注冊依賴屬性時,實質是關聯DependencyObject的propertyDeclarations,它是一個 Dictionary&lt;Type,Dictionary&lt;string,DependencyProperty&gt;&gt;類型,但是在 register代碼中并沒有完全關聯起來,我也比較納悶,是以這點還希望和大家一起探讨,微軟的BCL并沒有這麼實作。

  通過前面對DependencyObject和DependencyProperty的研究之後,我們來看看最重要的一個角色,這也是微軟最喜歡用的概念——中繼資料,如果大家研究過微軟BCL的源碼,應該都知道,它是貫穿于整個CLR當中的。

本文轉自KnightsWarrior51CTO部落格,原文連結:http://blog.51cto.com/knightswarrior/405232 ,如需轉載請自行聯系原作者

繼續閱讀