深入剖析依赖属性(WPF/Silverlight核心)(下)

十一. 依赖属性元数据

前面我们看到一个依赖属性的注册最全的形式是下面这样子的:

public static DependencyProperty Register(string name,
                      Type propertyType,
                      Type ownerType,
                      PropertyMetadata typeMetadata,
                      ValidateValueCallback  validateValueCallback);

第一个参数是该依赖属性的名字,第二个参数是依赖属性的类型,第三个参数是该依赖属性的所有者的类 型,第五个参数就是一个验证值的回调委托,那么最使我们感兴趣的还是这个可爱的 PropertyMetadata ,也 就是我们接下来要讲的元数据。 提到WPF属性元数据,大家可能第一想到的是刚才的PropertyMetadata,那么 这个类到底是怎样的呢?我们应该怎样使用它呢?首先我们看它的构造函数(我们选参数最多的来讲):

public PropertyMetadata(object defaultValue,
             PropertyChangedCallback propertyChangedCallback,
             CoerceValueCallback coerceValueCallback);

其中的第一个参数是默认值,最后两个分别是PropertyChanged(变化通知)以及Coerce(强制)的两个委 托变量,我们在实例化的时候,只需要把这两个委托变量关联到具体的方法上即可。

事实上,除了PropertyMetadata以外,常见的还有 FrameworkPropertyMetadata,UIPropertyMetadata。 他们的继承关系是F->U->P。其中以 FrameworkPropertyMetadata参数最多,亦最为复杂。

FrameworkPropertyMetadata的构造函数提供了很多重载,我们挑选最为复杂的重载来看它到底有哪些参数 以及提供了哪些功能:

public FrameworkPropertyMetadata(object defaultValue,
                  FrameworkPropertyMetadataOptions flags,
                  PropertyChangedCallback propertyChangedCallback,
                  CoerceValueCallback coerceValueCallback,
                  bool isAnimationProhibited,
                  UpdateSourceTrigger  defaultUpdateSourceTrigger);

其中第一个参数是默认值,最后两个参数分别是是否允许动画,以及绑定时更新的策略(在Binding当中相 信大家并不陌生),这个不详细解释了。重点看一下里第三、四两个参数,两个 CallBack的委托。结合前面 Register的时候提到的ValidateValueCallback共组成三大”金刚“,这三个Callback 分别代表Validate(验 证),PropertyChanged(变化通知)以及Coerce(强制)。当然,作为 Metadata, FrameworkPropertyMetadata只是储存了该依赖属性的策略信息,WPF属性系统会根据这些信息来提供功能并在 适当的时机回调传入的delegate,所以最重要的还是我们定义的这些方法,通过他们传入委托才能起到真正的 作用。

上面讲了元数据暴露给我们的构造函数,其实在其内部还提供了两个方法,这个在做自定义控件的时候, 也很值得注意:

protected virtual void Merge(PropertyMetadata baseMetadata, DependencyProperty  dp)
{
   // 实现元数据继承之间的合并
}
protected virtual void OnApply(DependencyProperty dependencyProperty, Type targetType)
{
   // 当元数据被这个属性应用,OnApply就会被触发,在此时元数据也将被密封起来。
}

前面讲了这么多,那么我们现在就来看看依赖属性回调、验证及强制值到底是怎么使用的呢?大家千万要 坚持住,后面内容更加精彩!

十二. 依赖属性回调、验证及强制值

我们通过下面的这幅图,简单介绍一下WPF属性系统对依赖属性操作的基本步骤:

时间: 2024-11-17 00:47:48

深入剖析依赖属性(WPF/Silverlight核心)(下)的相关文章

WPF基础到企业应用系列7深入剖析依赖属性(WPF/Silverlight核心)

一. 摘要 首先圣殿骑士很高兴这个系列能得到大家的关注和支持,这个系列从七月份开始到现在才第七篇,上一篇发布是在8月2日,掐指一算有二十多天没有继续更新了,最主要原因一来是想把它写好,二来是因为最近几个月在筹备"云计算之旅"系列,所以一再推迟了发布进度.之前一直都没有想过要录制视频,主要的原因还是怕自己知识有限,从而误导他人,所以前几次浪曦和51CTO邀请录制视频,我都以工作忙.公司内部培训需要时间和自己有待提高等理由委婉的拒绝了,说实在的,自己也知道自己还有很多地方有待提高,还需要向

深入剖析依赖属性(WPF/Silverlight核心)(上)

一. 摘要 前几篇我们讲了WPF的一些基本知识,但是始终没有接触最核心的概念,那么从这篇文章开始的下面几篇文 章中,我们会分别深入讨论一下依赖属性.路由事件.命令和绑定等相关概念,希望这几篇文章对大家能有所 帮助.由于自己才疏学浅且是对这些技术的使用总结和心得体会,错误之处在所难免,怀着技术交流的心态, 在这里发表出来,所以也希望大家能够多多指点,这样在使一部分人受益的同时也能纠正我的错误观点,以便 和各位共同提高. 二. 本文提纲 · 1.摘要 · 2.本文提纲 · 3.比这篇文章更重要的东西

WPF学习之依赖属性和附加属性

依赖属性(Dependency Property) .NET Framework 3.0引入了一个新的属性类型叫依赖属性, WPF,WF都在使用依赖属性用来实现样式化,数据绑定等.我们更多的使用依赖属性是为了让父元素的属性值在逻辑树上慢慢的传递到其子元素中,从而可以在整个可是父元素的逻辑子元素中共享属性值.WF就是依靠依赖属性来在工作流中的各Activity间传递属性值的. 所以,依赖属性内建的传递变更通知的能力是其最大特征. 如果你想让属性在一个包含内容子控件树的整个逻辑控件树中都有效并共享值

依赖属性之“风云再起”

一. 摘要 首先圣殿骑士很高兴"WPF 基础到企业应用系列" 能得到大家的关注.支持和认可.看到很多朋友留言希望加快速度的问题,我会尽力的,对你们的热情关注也表示由衷的感谢.这段时间更新慢的主要原因是因为忙着用TDD还原MONO的框架,同时也因为一直在研究云计算,所以就拖拖拉拉一直没有发布后面的文章.由于WPF整个系列是自己的一些粗浅心得和微薄经验,所以不会像写书那么面面俱到,如果有不足或者错误之处也请大家见谅.在今年之内圣殿骑士会尽量完成"WPF 基础到企业应用系列&quo

一起谈.NET技术,WPF/Silverlight深度解决方案:目录

介于目前WPF/Silverlight技术资料在国内相当稀缺,仅有的也是一些很基础的教程.为了更深度的剖析WPF/Silverlight的技术内涵,解决开发过程中的疑难杂症,分解实际应用案例的特色细节,"WPF/Silverlight深度解决方案"系列由此孕育而生.整个系列的所有文章均为原创,由本人的个人开发经验结合相关资料编写而成,过程中难免有错漏或不妥当的地方还望各位读者友善的指出.我们的目标只有一个:WPF/Silverlight技术深度挖掘.如果您有符合本系列主题的内容想要与大

WPF/Silverlight深度解决方案:目录

介于目前WPF/Silverlight技术资料在国内相当稀缺,仅有的也是一些很基础的教程.为了更深度的剖析WPF/Silverlight的技术内涵,解决开发过程中的疑难杂症,分解实际应用案例的特色细节,"WPF/Silverlight深度解决方案"系列由此孕育而生.整个系列的所有文章均为原创,由本人的个人开发经验结合相关资料编写而成,过程中难免有错漏或不妥当的地方还望各位读者友善的指出.我们的目标只有一个:WPF/Silverlight技术深度挖掘.如果您有符合本系列主题的内容想要与大

Silverlight:Dependency Property(依赖属性)学习笔记

1.定义依赖属性:           #region Text        public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(ImageButton), new PropertyMetadata(default(string), new PropertyChangedCallback(TextPrope

Silverlight的依赖属性与附加属性

好久没写Silverlight了,依赖属性(Dependency Property)和附加属性 (Attached Property)这两个算是很基础的知识都不是很记得了.写一写,当做 一下笔记吧. CLR属性 与 依赖属性 CLR属性我们非常熟悉了,在DotNet编程中随处可见.最简单最常见的属性访 问器就是直接操纵类的私有成员,如下: public class Person { private String _name; public string Name { get { return _

明晰Silverlight中的依赖属性

在c#中--得益于c#3.0中的自动属性--我们可以十分轻松的通过如下代码创建一个叫做 "AuthorName"的属性. public string AuthorName { get; set; } 上面的代码就是我们熟悉的CLR属性,我们可以很方便的读/取这个属性的值.不过在 silverlight的世界中如果你想做更多更牛的事情,CLR属性就显得有些力不从心了.它们包 括--动画.数据绑定.样式/模板等等. 因此,微软在WPF中提出了依赖属性(Dependency Property