基础内容 - 依赖关系属性和通知2011-10-19 msdn Charles Petzold目录依赖关系属性基础知识绑定源与目标使用通知自定义集合依赖关 系属性和事件动态绑定技术Freezable 差异使用 DependencyPropertyDescriptorDependencyObjects 集合这些天来,对象似乎已经忙得晕 头转向了。每个人都希望它们做这做那。Windows® Presentation Foundation (WPF) 应用程序中的 典型对象会接到各种各样不同的请求:有要求绑定到数据的、有要求更改样式的、有要求从可见父项继承 的,甚至还有要求来点动画让大家高兴一下的。对象怎么才能建立起边界和优先级呢?WPF 的回 答是一种称为依赖关系属性的功能。通过为 WPF 类提供结构化方法来响应由数据绑定、样式、继承和其 他来源更改带来的变化,依赖关系属性已变得十分重要,其程度不亚于事件和事件处理对早期 .NET 程序 员的重要性。当然,依赖关系属性不是万能的,它可能无法为某些传统任务提供您所需要的所有 功能。假设您可以访问具有依赖关系属性的对象,并且希望在其中某个属性发生变化时得到通知。这对于 事件处理程序来说好像并不是什么难事——但您要知道实际上根本不存在这样的事件!当您使用对象集合时,这个问题更加突出。在某些情况下,您可能希望当集合中对象的某些特定 依赖关系属性发生更改时得到通知。现有唯一的解决方案是 FreezableCollection<T>,它能够告 诉您何时发生变化——但不能告诉您是什么发生了变化。换句话说,依赖关系属性并 不总能与其他各方良好协作。本专栏主要讲述的就是如何弥补它们在通知方面的不足。依赖关系 属性基础知识假设您正在设计名为 PopArt 的 WPF 类,并且希望定义类型为 Brush 的属性 SwirlyBrush。如果 PopArt 继承自 DependencyObject,您就可以将 SwirlyBrush 定义为 DependencyProperty。第一步是公共静态只读字段:
public static readonly DependencyProperty SwirlyBrushProperty;
依赖关系属性与该属性具有相同的名称,但附加了 "Property" 字样。它是字段声明或静态构造函数的一部分,您可以随后注册依赖关系属性:
SwirlyBrushProperty = DependencyProperty.Register("SwirlyBrush", typeof(Brush), typeof(PopArt), new PropertyMetadata(OnSwirlyBrushChanged));
您还需要能够提供对该属性进行正常访问 的传统属性定义(有时称为 CLR 属性):
public Brush SwirlyBrush { set { SetValue(SwirlyBrushProperty, value); } get { return (Brush) GetValue(SwirlyBrushProperty); }}