天天看点

依赖属性之“风云再起”三八. 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 ,如需转载请自行联系原作者