依赖属性是建立在原有类属性基础之上的,且只能作用于dependencyobject对象上。可以当作wpf做了一个wrapper,声明依赖属性之前需要针对该属性的source和target以及影响范围先实例化一个frameworkmetadata的元数据,然后再对该属性进行register;接着利用dependencyobject自带的setvalue和getvalue方法进行类属型层次的封装。
某些类的依赖属性是可以共享的,通过调用该属性的addowner方法重用该属性,达到节约内存的目的
依赖属性还提供了一种较为特殊的兄弟:附加属性,它同样需要metadata实例一起使用registerattached方法进行声明,而且因为该特例的使用较为特殊相当于给其他类添加上本来就不具备的属性,所以不需要为该类属性加以普通.net属性具备的get和set的wrapper,但是需要声明两个静态方法g(s)etpropertyname以调用附加属性操作的目标类型的setvalue和getvalue方法从而取值和赋值。
tip:即使依赖属性未以附加属性进行声明,目标类型仍然可以利用setvalue方法对该依赖属性进行赋值,但是xaml代码中是不会有智能提示。
对于依赖属性的赋值,wpf提供了3种回调事件(根据触发链顺序)coercevaluecallback、validatevaluecallback和propertychangedcallback,前一事件未顺利触发的话均会导致后面的事件无法触发。由于validatevaluecallback无法访问到依赖属性的源对象即无法根据其他属性进行判断,因此碰到类似情况可以考虑利用coercevaluecallback事件(该事件是绑定到metadata上,因此其参数包含有源对象).对于coercevaluecallback事件应该谨慎用之,特别是涉及到对其它依赖属性进行更改的时候。