大致读了一遍programming windows phone 7这本书,也看了eula哥共享的关于DependencyObject与DependencyProperty的帖子,另外还有几个网友在问类似的问题;所以我来做个简短的总结,希望对大家有帮助
如果你没有开发过wpf/silverlight,读programming windows phone 7你会觉得很困惑,可能作者并没有考虑都这部分读者。
请先阅读这两篇文章,再看下面的总结
http://www.codeguru.com/csharp/. ... /article.php/c13015
http://www.devdiv.com/thread-51606-1-1.html
http://www.devdiv.com/thread-51607-1-1.html
http://nirajrules.wordpress.com/ ... dependencyproperty/
为什么要引入?
因为属性随着继承层次越来越多,子类的属性会发生膨胀,同时多数时候,子类并不更改父类属性值,没有必要每个子类对象都保存一个这样属性值,
所以引入了依赖属性
依赖属性的功能?
DependencyProperty有一个静态Dictionary成员,它负责存储所有的属性值,同时提供了读写方法。
不需要改变的属性都在这张系统唯一的表中,不需要每个子类对象保存一份;并且提供了修改和同一属性多值支持。
DependencyProperty与DependencyObject关系?
DependencyObject实际上是通过DependencyProperty来设置、查找类属性,它本身不存储,除非对象修改了属性
子类通过什么方式改变父类的属性?
首先DependencyProperty提供了对子类定制父类属性的支持,它提供了PropertyMetadata,
子类可以定义一个DependencyProperty的实例,通过修改PropertyMetadata可以设置子类的属性值
如何改变对象属性?
任何一个DependencyObject对象保存有一个EffectiveValues,用来存储对象改变的属性,
也就是说改变了的属性是存储再DependencyObject的对象里面的,不改变的存储在DependencyProperty中。
DependencyProperty中PropertyMetadata是支持子类改变父类的属性(注意:这里说的是子类的属性,而不是子类的实例,而DependencyProperty的静态Dictionary是保存不变的属性的
EffectiveValues中都有哪些值?
EffectiveValues中存的是属性改变值,因为改变的情况很多,所以这个值不是唯一的,其中包括BaseValue, AnimatedValue, CoercedValue, ExpressionValue
其中后面的比BaseValue的优先级高
改变对象属性值的优先级?
除了前面说的优先级问题,还涉及到BaseValue的确认问题,
BaseValue设置中本地设置,就是在xaml中直接给属性赋值或者在构造函数中给属性赋值优先级最高,其他的比如style, template, trigger等都比它优先级别低
返回属性到底返回的是什么值?
我们想获取属性的值,有这么多地方保存着,到底返回哪个呢?
wpf首先查找EffectiveValues,如果找到就返回,否则查找PropertyMetadata,如果失败查找DependencyProperty的静态Dictionary.
EffectiveValues与LocalValue什么关系?
前面已经解释了什么是LocalValue,其实LocalValue就是BaseValue中优先级最高的Local本地值
Why is it called DependencyProperty?它Depends on什么?
A dependency property depends on multiple providers for determining its value at any point in time. These providers could be an animation continuously changing its value, a parent element whose property value propagates down to its children, and so on. Arguably the biggest feature of a dependency property is its built-in ability to provide change notification.
如果你没有开发过wpf/silverlight,读programming windows phone 7你会觉得很困惑,可能作者并没有考虑都这部分读者。
请先阅读这两篇文章,再看下面的总结
http://www.codeguru.com/csharp/. ... /article.php/c13015
http://www.devdiv.com/thread-51606-1-1.html
http://www.devdiv.com/thread-51607-1-1.html
http://nirajrules.wordpress.com/ ... dependencyproperty/
为什么要引入?
因为属性随着继承层次越来越多,子类的属性会发生膨胀,同时多数时候,子类并不更改父类属性值,没有必要每个子类对象都保存一个这样属性值,
所以引入了依赖属性
依赖属性的功能?
DependencyProperty有一个静态Dictionary成员,它负责存储所有的属性值,同时提供了读写方法。
不需要改变的属性都在这张系统唯一的表中,不需要每个子类对象保存一份;并且提供了修改和同一属性多值支持。
DependencyProperty与DependencyObject关系?
DependencyObject实际上是通过DependencyProperty来设置、查找类属性,它本身不存储,除非对象修改了属性
子类通过什么方式改变父类的属性?
首先DependencyProperty提供了对子类定制父类属性的支持,它提供了PropertyMetadata,
子类可以定义一个DependencyProperty的实例,通过修改PropertyMetadata可以设置子类的属性值
如何改变对象属性?
任何一个DependencyObject对象保存有一个EffectiveValues,用来存储对象改变的属性,
也就是说改变了的属性是存储再DependencyObject的对象里面的,不改变的存储在DependencyProperty中。
DependencyProperty中PropertyMetadata是支持子类改变父类的属性(注意:这里说的是子类的属性,而不是子类的实例,而DependencyProperty的静态Dictionary是保存不变的属性的
EffectiveValues中都有哪些值?
EffectiveValues中存的是属性改变值,因为改变的情况很多,所以这个值不是唯一的,其中包括BaseValue, AnimatedValue, CoercedValue, ExpressionValue
其中后面的比BaseValue的优先级高
改变对象属性值的优先级?
除了前面说的优先级问题,还涉及到BaseValue的确认问题,
BaseValue设置中本地设置,就是在xaml中直接给属性赋值或者在构造函数中给属性赋值优先级最高,其他的比如style, template, trigger等都比它优先级别低
返回属性到底返回的是什么值?
我们想获取属性的值,有这么多地方保存着,到底返回哪个呢?
wpf首先查找EffectiveValues,如果找到就返回,否则查找PropertyMetadata,如果失败查找DependencyProperty的静态Dictionary.
EffectiveValues与LocalValue什么关系?
前面已经解释了什么是LocalValue,其实LocalValue就是BaseValue中优先级最高的Local本地值
Why is it called DependencyProperty?它Depends on什么?
A dependency property depends on multiple providers for determining its value at any point in time. These providers could be an animation continuously changing its value, a parent element whose property value propagates down to its children, and so on. Arguably the biggest feature of a dependency property is its built-in ability to provide change notification.