WPF 依赖项属性

属性和事件是.NET抽象模型的核心部分, 而WPF中则用更高级的依赖项属性(Dependency Property)代替了原来.NET中的属性.依赖项属性主要应用于自定义元素中,用于为自定义元素注入自定义的属性.

1、定义依赖项属性,他是DependencyProperty类的实例。

静态属性: 由于依赖项属性需要在多个类之间共享,所以对象应该定义为与其相关联的类的静态字段。

public class InfoElement
{
    public static readonly DependencyProperty MarginProperty;//依赖属性的定义
}

2、注册创建的依赖性属性。

static InfoElement()
{

    // 设置元数据
    FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(

    new Thickness(),FrameworkPropertyMetadataOptions.AffectsMeasure);

    
    //   属性的注册
    // 参数: 属性名,属性使用的数据类型,拥有该属性的类型,元数据对象,验证属性的回调函数
    MarginProperty = DependencyProperty.Register("Margin",

    typeof(Thickness),typeof(InfoElement),metadata,

    new ValidateValueCallback(InfoElement.IsMarginValid));
}

3、属性包装器:

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

4、属性验证

        

WPF中提供了两种方法来用于验证依赖属性的值。

       1、ValidateValueCallback:该回调函数可以接受或拒绝新值。该值可作为DependencyProperty.Register方法的一个参数。

       2、CoerceValueCallback:该回调函数可将新值强制修改为可被接受的值。例如某个依赖属性工作年龄的值范围是25到55,在该回调函数中,可以对设置的值进行强制修改,对于不满足条件的值,强制修改为满足条件的值。如当设置为负值时,可强制修改为0。该回调函数PropertyMetadata构造函数参数进行传递。

注册说明

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

名称

说明

Register(String, Type, Type)

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

Register(String, Type, Type, PropertyMetadata)

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

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

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

在Register中,各个参数解释如下:

String:依赖属性的名字(不加Property,即字段的名字);

Type:属性的类型;

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;//这里实现验证
         }
}

一般将DependencyObject 配置为WPF中已有的控件类型,然后对其进行自定义依赖属性的设置,

例如自定义元素为MyButton,即拥有button控件的所有属性,也拥有自定义的属性

class MyButton : Button
{
        // 属性定义和注册
         public static readonly DependencyProperty MyfieldProperty = DependencyProperty.Register("Myfield", typeof(int), typeof(MyButton ), new PropertyMetadata(0), new ValidateValueCallback(new MyButton ().MyValidateMethod));
        //属性设置
          public int Myfield
         {
              get { return (int)GetValue(MyfieldProperty); }
              set { SetValue(MyfieldProperty, value); }
          }
            // 属性验证
          public bool MyValidateMethod(object value)
         {
             return true;//这里实现验证
         }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值