在微软WPF中的“附加属性(Attached Property)”是否属于“依赖属性(Dependency Property)”的一种?

1 篇文章 0 订阅
1 篇文章 0 订阅

答案

关于这个问题网上有很多资料给出的答案都是错误的,我这里可以很负责的给出一个正确的答案,并且会分析其中的原因。



答案:不是!!




原因分析

网上有很多资料都说WPF中的“附加属性(Attached Property)”属于“依赖属性(Dependency Property)”的一种,这是不对的。所谓的“依赖属性(Dependency Property)”就是被WPF的属性系统管理的属性。要想实现这点,就要求我们在定义“依赖属性(Dependency Property)”的时候必须满足下面的两个条件:

  1. 用“套路”在一个类中定义“依赖属性(Dependency Property)”,这个“套路”可以参见微软官方文档中的代码示例
  2. 定义“依赖属性(Dependency Property)”的类必须继承“DependencyObject”这个抽象类。这一点非常重要,也是我们最容易忽略的。如果我们仔细想一想也能明白第2点的原理,WPF的内部实现了一个属性管理系统,既然这个系统要管理属性,那么这些属性所在的类必须有一个统一的接口(这个接口不是C#语言中的接口)才行啊,这样一来这些类实例化的对象才能被统一管理起来,而这个统一的接口就是“DependencyObject”这个抽象类了。



明白了“依赖属性(Dependency Property)”的定义和实现,我们再来看看“附加属性(Attached Property)”。“附加属性(Attached Property)”的定义和“依赖属性(Dependency Property)”非常类似,也是用“DependencyProperty”这个类的静态方法来注册,不过使用的静态方法是“RegisterAttached”而不是“Register”,并且返回的对象类型也是“DependencyProperty”。这样看起来“附加属性(Attached Property)”好像就是“依赖属性(Dependency Property)”了,不过我们忽略了“依赖属性(Dependency Property)”实现的第2点,即定义“依赖属性(Dependency Property)”的类必须继承“DependencyObject”这个抽象类。而我们在定义“附加属性(Attached Property)”的时候并没有强制要求定义“附加属性(Attached Property)”的类要继承任何的类。所以我们可以得出如下的结论:

  1. 如果我们在定义“附加属性(Attached Property)”的时候定义它的类继承了“DependencyObject”这个抽象类,那么这个类中定义的所有“附加属性(Attached Property)”都属于“依赖属性(Dependency Property)”。
  2. 如果我们在定义“附加属性(Attached Property)”的时候定义它的类没有继承“DependencyObject”这个抽象类,那么这个类中定义的所有“附加属性(Attached Property)”都不属于“依赖属性(Dependency Property)”。这点是我们最容易忽略的,也是网上很多资料都说错的原因,这些错误的资料忽略了第2点,并且又被定义“附加属性(Attached Property)”的类名(DependencyProperty类)和返回值类型(DependencyProperty类)的名称给误导了。



我的建议

在定义“附加属性(Attached Property)”的时候尽量让定义它的类继承“DependencyObject”这个抽象类,这样就可以将“附加属性(Attached Property)”变成“依赖属性(Dependency Property)”。在WPF中“依赖属性(Dependency Property)”的好处有很多的,比如,数据绑定、动画等等这些功能的实现都需要该属性是“依赖属性(Dependency Property)”,否则无法实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值