WPF-11:属性-2

来自《深入浅出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实例的哈希值。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值