依赖项属性是专门针对WPF创建的,但WPF库中的依赖项属性都使用普通的.NET属性过程(property procedure)进行了封装。
1.定义依赖项属性
注:只能为依赖对象(继承自DependencyObject的类)添加依赖项属性。幸运的是,WPF基础结构的关键部分中的大部分都间接继承自DependencyObject类,最明显的例子就是元素。
依赖项属性需要在多个类之间共享信息,所以必须将DependencyProperty对象定义为与其相关联的类的静态字段。并且按照约定,依赖项属性的字段的名称是在普通属性的末尾处加上单词“Property”。
1 public class FrameworkElement 2 { 3 public static readonly DependencyProperty MarginProperty; 4 }
说明:
通过单词“Property”可从实际属性的名称中区分出依赖项属性的定义。
字段的定义使用了readonly关键字,这意味着只能在FrameworkElement类的静态构造函数中对其进行设置。
1.2注册依赖项属性
定义DependencyProperty对象只是第一步,使用依赖项属性,还需要使用WPF注册创建的依赖项属性,并且注册需要在任何使用属性的代码之前完成,因此必须在与其关联的类的静态构造函数中进行。
WPF确保DependencyProperty对象不能被直接实例化,因为DependencyProperty类没有公有的构造函数,只能使用静态的DependencyProperty.Register()方法创建DependencyProperty实例。
声明依赖项属性:
1 public static readonly DependencyProperty AttachContentProperty = DependencyProperty.RegisterAttached( 2 "AttachContent", typeof(ControlTemplate),typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));
属性名:AttachContent;
属性使用的数据类型:ControlTemplate
拥有该属性的类型:ControlAttachProperty
一个具有附加属性设置的FrameworkPropertyMetadata对象,,该要素是可选的
一个用于验证属性的回调函数,该要素是可选的
Get依赖项属性:
1 public static ControlTemplate GetAttachContent(DependencyObject d) 2 { 3 return (ControlTemplate)d.GetValue(AttachContentProperty); 4 }
Set依赖项属性:
1 public static void SetAttachContent(DependencyObject obj, ControlTemplate value) 2 { 3 obj.SetValue(AttachContentProperty, value); 4 }
WPF编程宝典之依赖项属性(八)