WPF 依赖项属性

Posted yinghualuowu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF 依赖项属性相关的知识,希望对你有一定的参考价值。

WPF中的依赖项属性

“依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值”,只有定义属性为依赖项属性,这个属性才支持样式设置,数据绑定,继承,动画和默认值。

属性对应的字段必需是公有,静态,只读的,类型为DependencyProperty。即public static readonly DependencyProperty 字段名,同时字段的命名也有规范,属性名+Property,字段在定义时,通过DependencyProperty.Register来实注册属性(只有注册了,才能使用WPF属性系统的服务)。

Register方法有三种重载,如下:

名称

说明

Register(String, Type, Type)

使用指定的属性名称、属性类型和属性所在对象的类型。

Register(String, Type, Type, PropertyMetadata)

使用指定的属性名称、属性类型、属性所在对象的类型和属性元数据注册依赖项属性。

Register(String, Type, Type, PropertyMetadata, ValidateValueCallback)

使用指定的属性名称、属性类型、属性所在对象的类型、属性元数据和属性的值验证回调来注册依赖项属性。

string 依赖属性的名字,即字段的名字

1 Type  属性的类型

2 Type 属性所属对象的类型

PropertyMetadata:依赖项对象的属性元数据,是一个PropertyMetadata类型,可能赋初始值。PropertyMetadata有一个object的构造函数;

ValidateValueCallback:表示用作回调的方法,这个类型是一个委托,用于验证依赖项属性的值的有效性,因为是委托,故它的构造参数为一个方法名。

下文中代码基本构成为:

class MyClass : DependencyObject{
        public static readonly DependencyProperty MyfieldProperty = DependencyProperty.Register("Myfield", typeof(int), typeof(MyClass), new PropertyMetadata(0), new ValidateValueCallback(new MyClass().MyValidateMethod));
        public int Myfield
        {
            get { return (int)GetValue(MyfieldProperty); }
            set { SetValue(MyfieldProperty, value); }
        }
        public bool MyValidateMethod(object value)
        {
            return true;//这里实现验证
        }
 }

 

理解依赖项属性

依赖项属性是标准的全新实现,WPF提供的大多数属性都是依赖项属性。依赖项属性是专门针对WPF创建的。但WPF库中的依赖项属性都使用普通的.Net属性过程进行了封装。

定义依赖项属性

只能为依赖对象(继承自DependencyObject类)添加依赖项属性

第一步是定义表示属性的对象,它是dependencyProperty类的实例,比如

技术分享图片

定义的依赖项属性的字段的名称是在普通属性的末尾处加上单词Property

字段的定义使用了readonly关键字,这意味着只能在Framework类的静态构造函数中对其进行设置

注册依赖项属性

为了使用依赖项属性,还需要使用WPF注册创建的依赖项属性

WPF确保DependencyProperty对象不能被直接实例化,因为它没有公有的构造函数

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

添加属性包装器

最后一个步骤就是用传统的.Net属性封装WPF依赖项属性

而WPF属性的属性过程是使用在DependencyObject基类中定义的GetValue和SetValue方法

public Thickness Margin{
            set { SetValue(MarginProperty,value); }
            get { return (Thickness)GetValue(MarginProperty); }
}

但创建属性封装器时,应当只包含对SetValue和GetValue方法的调用

技术分享图片

共享的依赖项属性

尽管一些类具有不同的继承层次,但它们会共享同一依赖项属性,比如:TextBlock.FontFamily属性和Control.FontFamily属性指向同一个静态的依赖项属性,该属性实际上是在TextElement类中定义的TextElement.FontFamilyProperty依赖项属性。

通过调用:

技术分享图片

附加的依赖项属性

技术分享图片

属性验证

在定义任何类型的属性时,都需要面对错误设置属性的可能性。对于依赖项属性来说,有两种方法阻止非法值:

技术分享图片

CoerceValueCallback方法有机会修改提供的值(通常,使提供的值和其他属性相容)或者返回Dependency.UnsetValu,这会完全拒绝修改。

接下来激活ValidateValurCallback方法。该方法返回true以接受一个值作为合法值,或者返回false拒绝值,与Coerce方法不同,validateValueCallback方法不能访问设置属性的实际对象,这意味着你不能检查其他属性值。

如果上面的都成功,就会触发PropertyChangedCallback方法。此时,如果希望为其他类提供通知,可以引发更改事件。

 

以上是关于WPF 依赖项属性的主要内容,如果未能解决你的问题,请参考以下文章

WPF--属性系统

WPF--属性系统

WPF编程宝典之依赖项属性

WPF学习第十一章 理解依赖项属性

WPF的依赖项属性

WPF 依赖项属性