WPF 依赖属性

依赖属性就是自己没有值,通过Binding从数据源获得值,就是依赖在别人身上,拥有依赖属性的对象称为依赖对象。依赖属性才能使用Binding。

使用场景:

1 在样式中设置属性

2 属性支持数据绑定

3 使用动态资源引用设置属性

4 从元素树中的父元素自动继承属性值

5 属性可进行动画处理

6 属性在属性系统、环境或用户持行的操作或者读取并使用样式更改了属性以前的值时报告

7 使用已建立的、WPF进程也使用的元数据约定,例如报告更改属性值时是否要求布局系统重新编写元素的可视化对象,依赖对象创建时并不包含存储数据的空间。WPF中必须使用依赖对象作为依赖属性的宿主

用于数据绑定:

依赖属性是针对一个类的静态属性

每个实例去这个静态属性里面Get属于自己的那一个属性

对象有属性,属性的值去公共数据局域(所有类实例的依赖属性都在一个静态变量里面)里面取

优势:公共数据局域不在UI线程,所以可以随时修改数值

优点:

1 依赖属性加入属性变化通知、限制、验证等功能。这样可以使我们更方便的实现应用,同时大大减少了代码量。许多之前需要写很多代码才能实现的功能,在WPF中可以轻松实现。

2 节约内存:在Winform中,每个UI控件都赋予了初始值,这样每个相同的控件都会保存一份初始值。而在WPF中依赖属性很好的解决了这个问题,它内部实现使用哈希表存储机制,对多个相同控件的相同属性的值都只保存一份。

3 支持多种提供对象:可以通过多种方式来设置依赖属性的值,可以配合表达式、样式和绑定来对依赖属性设置值。

 

定义:

1 让依赖属性的所在类继承自DependencyObject类

2 使用pubilc static声明一个DependencyProperty的变量,该变量就是真正的依赖属性

3 在类型的静态构造函数中通过Register方法完成依赖属性的元数据注册

4 提供一个依赖属性的包装属性,通过这个属性来完成对依赖属性的读写操作

public int Total
{
get { return (int)GetValue(TotalProperty); }
set { SetValue(TotalProperty, value); }
}

// Using a DependencyProperty as the backing store for Total. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TotalProperty =
DependencyProperty.Register("Total", typeof(int), typeof(Pagination), new PropertyMetadata(0, InitPagination));

private void InitPagination

{

}

 

依赖属性的监听:

我们可以使用2种方法对依赖属性的改变进行监听:

1 使用DependencyPropertyDescriptor类

public class MyTextBox:TextBox

{

  public MyTextBox():base()

  {

  }

  static MyTextBox()

  {

    TextProperty.OverrideMetadata(typeof(MyTextBox),new FrameworkperopertyMetadata(new Propertychangedcallback(TextPropertychanged)));

  }

  private static void TextPropertychanged(DependencyObject sender,DependencyPropertyChangedEventArgs args)

  {

    

  }

}

 

2 使用OverrideMetadata方式

public MainWindow()

{

  InitializeComponent();

  DependencyPropertyDescriptor descriptor = 

DependencyPropertyDescriptor.FromProperty(TextBox.TextProperty,typof(TextBox));

  descriptor.AddvalueChanged(tbxEditMe_TextChanged);

}

prvate void tbxEditMe_TextChanged(obj sender, EventArgs e)

{

}

 

posted @ 2021-03-11 17:25  黄恒瑞  阅读(124)  评论(0)    收藏  举报