来自《深入浅出WPF》(刘铁猛)读书笔记
依赖对象的依赖属性是一个static,那调用依赖对象的SetValue方法时,值被存储到哪里?
依赖属性大致分两步:Register;Set、GetValue。
DependencyProperty类具有这样一个成员:
private static Hashtable PropertyFromName=new Hashtable();
一旦程序运行,就会有这样一个全局的Hashtable存在,这个Hashtable就是用来注册DependencyProperty实例的地方。
Register方法的“完整版”:
private static DependencyProperty RegisterCommon
{
string name,
Type propertyType,
Type ownertype,
PropertyMetadata defaultMetadata,
ValidateValueCallback validateValueCallback
}
每对“CRL属性名-宿主类型”所决定的DependencyProperty实例就是唯一的。也就是说,尝试使用同一个CRL属性名字和同一个宿主进行注册,程序就会抛出异常。
结果:创建一个DependencyProperty实例并用它的CLR属性名和宿主类型名生成hash Code,最后hash code和DependencyProperty实例作为Key-Value对存入全局的,名为PropertyFromName的Hashtable中。这样,WPF属性系统通过CLR属性名和宿主类型名就可以从这个全局的Hashtable中检索出对应的DependencyProperty实例。
最后,生成的DependencyProperty实例被当做返回值交还。
上面注册进全局的hash值并不是DependencyProperty实例的哈希值,每一个DependencyProperty实例都具有一个名为GlobalIndex的int类型属性,GlobalIndex的值是经过一些算法得到,确保每个DependencyProperty实例的GlobalIndex是唯一的。所以,GlobalIndex属性值也就是DependencyProperty实例的哈希值。