Welcome

首页 / 软件开发 / .NET编程技术 / 基础内容 - 依赖关系属性和通知

基础内容 - 依赖关系属性和通知2011-10-19 msdn Charles Petzold目录

依赖关系属性基础知识

绑定源与目标

使用通知自定义集合

依赖关 系属性和事件

动态绑定技术

Freezable 差异

使用 DependencyPropertyDescriptor

DependencyObjects 集合

这些天来,对象似乎已经忙得晕 头转向了。每个人都希望它们做这做那。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); }}