。依赖属性是WPF个人觉得对精彩和最有特色的部分。所以特地先拿出来。
首先要实现Dependency Property 则必须要继承Dependency Object。如果看下WPF的基础控件其实都间接或者直接继承Dependency Object,这点规律性我在后面再做规律陈述。
首先Dependency Object 我搬下书的描述
Only the thread that the Dispatcher was created on may access the DispatcherObject directly. To access a DispatcherObject from a thread other than the thread the DispatcherObject was created on, call Invoke or BeginInvoke on the Dispatcher the DispatcherObject is associated with.
这点完全契合WPF的线程模型。首先DO是和线程相关,只有创建线程可以访问DO。这就是为什么在WPF我们自己创建的线程想要改变UI元素,则必须Dispatcher.Invoke和BeginInvoke了。
DP的特色和知识点信息量巨大。作为一个学习笔记,我只列出精华内容。
1 继承性
这点和WPF的视觉树契合
2 内存节约性
通过默认值,可以大大节约值的设置
3 多值存储性(优先级性)
public enum BaseValueSource
{
Unknown = 0,
Default = 1,
Inherited = 2,
DefaultStyle = 3,
DefaultStyleTrigger = 4,
Style = 5,
TemplateTrigger = 6,
StyleTrigger = 7,
ImplicitStyleReference = 8,
ParentTemplate = 9,
ParentTemplateTrigger = 10,
Local = 11,
}
这个优先级可以回答大多数更新值没有起作用的疑问了。
5 PropertyChangedCallback
值变更回调。
这里特别提醒注意的是,是所有DP值赋值都会走set属性这条路,如果是通过Express来Binding或者直接Xmal赋值,WPF会自己去走一条“偷偷摸摸”的捷径,关于这点几乎所有的WPF新手都会中招,祝大家踩吭愉快。
好了,说到最后,个人认为DO,DP体现是WPF专门针对UI来设计的。对于需要自定义用户控件特别需要加深理解。
同时,DP和DO对于Binding也是一衣带水的,简而言之,DP是Binding的“左值” ,而DataContext是Binding的“右值” 。
世事无绝对,当然DO也能当“右值”使用,但是这个是个人喜好,我一家之言认为DO作为右值有点“太重”。由内而外的理解有助于WPF的学习。
DO和DP的学习资料
一站式WPF--依赖属性(DependencyProperty)一
一站式WPF--依赖属性(DependencyProperty)二
WPF基础到企业应用系列7——深入剖析依赖属性
WPF基础学习笔记(一)Dependency Object 和 Dependency Property
原文:http://www.cnblogs.com/soapgu/p/4660084.html