阅读Internals of Dependeny Property in WPF后,我想知道如何在Silverlight for WP7中实现Dependeny Properties。对于调查,使用了来自xda forum的Reflector和Dll。
在WPF中:
DependencyProperty维护所有的静态引用 您在WPF对象层次结构中注册的DependencyProperty。它坚持 一个名为PropertyFromName的HashTable,它在内部使用它来获取 DependencyProperty对象。所以换句话说,每个dependencyProperty object在全局HashTable中注册。
在Silverlight for WP7中,DependencyProperties具有几乎相同的全局HashTable(实际上它是
static Dictionary<Type, Dictionary<string, DependencyProperty>> _registeredProperties
)
但是在查看 DependencyObject 类的 GetValue 和 SetValue 方法的源代码后,我看到_ registeredProperties < / em>根本没用过。
有人知道为什么以这种方式实施吗?或许我错过了什么? 提前谢谢。
答案 0 :(得分:1)
我认为你确实错过了一些东西。 _registeredProperties
字典(以及它在WPF中具有的等效字典)用于通过名称检索依赖项属性。它主要用于绑定机制(框架必须从类似{Binding Path=PropertyName}
的表达式中检索DP)。
当您在GetValue
或SetValue
时,您已经拥有对DP的引用(它是该方法的第一个参数)。因此,_registeredProperties
在那里没用。 GetValue
和SetValue
都使用_valueTable
类型的另一个字典Dictionary<DependencyProperty, EffectiveValueEntry>
。 _valueTable
是将值与DP关联的实际集合。