(二)依赖项属性

前端之家收集整理的这篇文章主要介绍了(二)依赖项属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@依赖项属性与.NET普通属性

WPF中元素提供的大多数属性都是依赖项属性。依赖项属性是专门针对WPF创建的。


定义依赖项属性

依赖项属性只能为依赖对象添加 (WPF中的元素等大部分基础结构都继承至DependencyObject)

依赖对象指继承至(DependencyObject)的类所定义的对象

  • **定义表示属性的对象(DependencyProperty类的实例)。属性信息应该始终保持可用,
    甚至需要在多个类之间共享这些信息,FrameworkElement 中定义了Margin属性,所有的元素都共享该属性。因此必须需要把DependencyProperty对象定义为与其相关联的类的静态字段。**
// FrameworkElement 中的Margin属性
public class FrameworkElement: UIElement,...
{
    public class readonly DependencyProperty MarginProperty;
    ...
}

注册依赖性属性

  • DependencyProperty没有public的构造函数,因此不能被直接实例化。实例化需要使用静态的DependencyProperty.Register()等方法创建其的实例。
  • DependencyProperty对象创建后WPF为了不让改变对象,将DependencyProperty成员设置成只读的。他们的值必须使用Register方法的参数来提供。

注册依赖属性需要由两个步骤:
- 创建FrameworkPropertyMetadata 对象。这个对象描述了通过依赖项属性使用什么服务(数据绑定,动画,日志)
- 通过DependencyProperty.Register()静态方法注册属性

//继续接上面的例子
//静态构造函数初始化MarginProperty
static FrameworkElement()
{
    //创建FrameworkPropertyMetadata对象
    FrameworkPropertyMetadata Metadata = new FrameworkPropertyMetadata(
        new Thickness(),FrameworkPropertyMetadataOptions.AffectsMeasure //当一个元素的边距发生变化,布局容器就会重新布局,确定元素新布局
    );

    //注册属性
    MarginProperty = DependencyProperty.Register(
    "Margin"//属性
    typeof(Thickness), //属性使用的数据结构
    typeof(FrameworkElement),//拥有该属性的类型,即当前类名
    Metadata,//一个具有附加属性设置的FrameworkPropertyMetadata对象,该参数可选
    new ValidataValueCallback(FrameworkElement.IsMarginValid) //验证属性的回调函数,可选。
    )
}

添加属性包装器

使用传统的.Net属性封装WPF依赖项属性。需要使用DependencyObject基类中定义的GetValue()和SetValue()方法
例子:

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

在上面的例子中不应当添加添加任何验证属性值的额外代码,引发事件的代码。这是因为WPF中的,直接调用SetValue()GetValue()。验证操作应该放在DependencyProperty.ValidateValueCallback回调函数中,事件触发因在FrameworkPropertyMetadata.PropertyChangedCallback回调函数中进行。

下面由三点注意:


  • 依赖属性的包装器是一个CLR属性,初学者容易把包装器认为是依赖属性,依赖属性实际上就是那个由public static readonly修饰的DependencyProperty,有没有包装器这个依赖属性都是存在的。
  • 那么这个包装器是用来干什么的?包装器的作用是以“实例属性”的属性向外界暴露依赖属性,这样使用的时候依赖属性才能成为数据源的一个Path。 注册依赖属性时使用的第二个参数是一个数据类型,它时包装器的类型,它应该叫依赖属性注册类型。一般也把它叫依赖属性的类型。但是严格的说依赖属性永远都是DependencyProperty。

猜你在找的设计模式相关文章