与普通CLR属性相比,依赖属性有多大优势?

时间:2010-12-03 12:03:43

标签: wpf

为什么microsoft说Dependency Property比普通的CLR属性有很多优势?是否有可能通过依赖属性可以执行的普通属性来完成所有事情?

3 个答案:

答案 0 :(得分:3)

虽然Kishore Kumar的链接中的答案非常重要,但我想补充一点:实际上没有任何“正常财产”这样的东西。属性实际上只是伪装的方法调用,因此您可以以您认为合适的任何方式实现它们。

C#3确实添加了自动属性,它们在字段顶部实现属性,并且使用字段作为属性的后备存储肯定是很常见的。虽然你可以称之为“正常”,但这种财产并没有什么特别之处。就CLR而言,DP是一个普通属性:它以正常方式提供getter和setter,这意味着任何理解CLR属性的语言在访问属性时都可以使用普通属性语法。

并不是简单的字段支持属性是唯一的常见实现。例如,许多类在其属性访问器中执行额外的工作以支持INotifyPropertyChanged。但是说这些不是“正常”属性是奇怪的。

所以从某种意义上说,DP只是实现普通属性的众多不同方式之一。

所以回答这个问题:是的,“可以通过依赖属性可以执行的普通属性来做所有事情”因为你只是使用依赖属性作为普通属性的实现。

现在,如果您希望您的属性提供DP提供的所有相同行为,而无需在您的实现中实际使用DP系统......这将是一项很多工作。在某些情况下,甚至不可能:例如,如果你想要一个可以参与ControlTemplate内的TemplateBinding的属性,那么就我所知,它绝对必须是一个DP。但是,如果忽略高度专用于WPF的DP功能,那么是的,您可以重新创建等效行为。毕竟,WPF只是代码。因此,如果WPF可以做某事,那么你也可以 - 只要有足够的时间和资源,你就可以编写自己的WPF版本。

答案 1 :(得分:0)

基本上,使用DP,您可以获得许多正常属性没有的事件。我知道注册它们很繁琐,但它们非常灵活:)

Kishore链接中的更多信息:p

答案 2 :(得分:0)

依赖属性很难进行单元测试,所以不应该在ViewModels中使用(正如有些人那样),而只能在WPF UI控件中使用