• DependencyProperty 概念
  • 依赖属性创立
  • 自定义控件的依赖属性

DependencyProperty 概念

依赖属性就是一种能够本人没有值,并能通过应用Binding从数据源取得值(依赖在他人身上)的属性。领有依赖属性的对象称为"依赖对象"。 继承树上能够看出,WPF的所有UI控件都是依赖对象。

WPF开发中,必须应用依赖对象作为依赖属性的宿主,使二者联合起来。依赖对象的概念被DependencyObject类所实现,依赖属性的概念则由DependencyProperty类所实现

WPF框架的编程常常和界面打交道,常常遇到的一个状况是某个属性的值的变动会影响到多个其余对象。比方当一个Button的扭转大小超过了它的容器,他的容器应该主动调整大小。于是咱们思考在每个属性的set办法中触发一些事件,但很快咱们发现现有的性能很难满足咱们的需要,至多不能简洁丑陋的满足这些需要。
实际上咱们的需要更加简单,WPF中的数据绑定,XAML语法等很多中央都和属性密切相关,咱们迫切需要一种性能更加弱小的属性。

于是在WPF中,引入了一种非凡的属性,Dependency Property。这种属性和一般的属性最大不同在于,它的值的起源并不繁多。对这种属性的取值和赋值都会能与其余对象有影响,因而能失去很大的灵活性

依赖属性创立

1、输出快捷键 "Propdp" 点击 TAB 按键主动生成默认 依赖属性如下为零碎默认依赖属性

public int MyProperty{   get { return (int)GetValue(MyPropertyProperty); }    set { SetValue(MyPropertyProperty, value); }}// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...public static readonly DependencyProperty MyPropertyProperty =      DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));

依照本人的须要批改依赖属性名称、属性名称。
依赖属性实例并非应用new操作符失去而是应用DependencyProperty.Register办法生成。

DependencyProperty.Register的参数阐明

  • 第一个参数为int类型,示意指明以哪个CLR属性作为这个依赖属性的包装器。就是代码"MyProperty"
  • 第二个参数指明此依赖属性用来存储什么样的值。
  • 第三个参数用来指明此依赖属性的宿主是什么类型,或者说DependencyProperty.Register办法要将这个依赖属性注册到哪个类型上

<font color=red>留神</font>

  • 1.依赖属性包装器是一个CLR属性,并不是依赖属性,没有包装器,依赖属性仍旧存在。
  • 2.既然没有包装器依赖属性也存在,那么包装器是干什么用的呢?包装器的作用是以"实例属性"的模式向外界裸露依赖属性,这样,一个依赖属性能力成为数据源的一个Path。
  • 3.注册依赖属性时应用的第二个参数是一个数据类型,这个数据类型也是包装器的数据类型。

    DependencyProperty.Register带4个参数,第四个参数的类型是PropertyMetadata类,作用是给依赖属性的DefaultMetadata属性赋值。顾名思义,DefaultMetadata的作用就是向依赖属性的调用者提供一些根本信息,这些信息包含:

  • CoerceValueCallback:依赖属性的值被强制扭转时此委托会被调用,此委托可关联一个函数。
  • DefaultValue:依赖属性未被显示赋值时,若读取之则取得此默认值,不设置此值会抛出异样。
  • IsSealed:管制PropertyMetadata的属性值是否能够更改,默认值为true。
  • PropertyChangeCallback:依赖属性的值被扭转之后此委托会被调用,此委托可关联一个函数。

<font color= blue> 探索</font>

第四个参数反对 PropertyMetadate 类型,同时它派生的UIPropertyMetadata类型
以及UIPropertyMetadata派生的FrameworkPropertyMetadata 在不同类型上实现的成果略有差别,此次提出一个典型

若依赖属性为ObservableCollection<T>的时候,必须要应用FrameworkPropertyMetadata作为参数,代码如下,给DefaultVaule、DefaultUpdateSourceTrigger 赋默认值。

        new FrameworkPropertyMetadata                {                    DefaultValue = new ObservableCollection<T>(),                    DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged                });

到此刻,依赖属性创立曾经实现。

自定义控件的依赖属性

依赖属性个别的应用场景为利用在自定义控件上,自定义控件实现依赖属性有如下三个留神点

  • 定义对象是int、string等类型的时候,能够应用PropertyMetadate作为触发参数
  • 若定义的依赖属性为ObservableCollection 则register 中的第四个参数应该调整为 FrameworkPropertyMetadata,并附上默认值。
  • XAML绑定 依赖属性,必须通过 RealtiveSource 实现绑定,不同能通DataContext Self 的模式,因为UserContrl 须要对后续数据源的输出,若应用DataContext Self 的模式,则无奈实现数据更新

博主GitHub地址
https://github.com/yuyue5945

关注公众号留下您的困惑或见解