1.什么是依赖项属性?
Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行库 (CLR) 属性的功能。这些服务通常统称为 WPF 属性系统。由 WPF 属性系统支持的属性称为依赖项属性。
2.为什么需要依赖项属性?
“依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值”,这是官方的一句话,理解起来有点费劲。属性本身其实很简单,就是用来封装了字段的,本质上是两个访问器,来达到对字段值的读与写,以及从业务角度保护字段的业务有效性(因为大部分字段都有一定的业务含义,即有业务含义,就有一定范围,比如工资,是个小数的类型,但工资不可能是负数,所以在封装工资字段时,要在set访问器中作限制)。
但依赖项属性不只这么简单了,属性的值不是简单的封装字段,而是根据其他的输入值来决定本属性的值。其他输入值是什么呢?例如通过数据绑定,资源或样式。
依赖项属性值可以通过引用资源来设置。
依赖项属性可以通过数据绑定来引用值。
依赖项属性可以通过设置样式来实现。在设置定义应用程序用户界面 (UI) 的属性时,样式尤其有用
可以对依赖项属性进行动画处理。
3.为什么要这样做?
因为在WPF体系中,只有定义属性为依赖项属性,这个属性才支持样式设置,数据绑定,继承,动画和默认值。也就是这个属性才能具有WPF中的一些特点。只有依赖项属性才能在Xaml文件中设置值,CLR属性只能在代码文件中设置值。
4.如何自定义依赖项属性?
第一步:注册自定义依赖项属性到WPF属性系统
例如:
public static readonly DependencyProperty ColorProperty = DependencyProperty.Register(
"Color",//属性名称
typeof(String),//属性类型
typeof(Customer),//属性属于哪个类
new PropertyMetadata("Red")//和属性相关的元数据
);
命名约定:创建标识符字段(ColorProperty )时,请将此字段命名为所注册的属性名称(Color),并加上后缀 Property。此字段是依赖项属性的标识符。
第二步:实现包装
public String Color{ get { return (String)ColorProperty); } set { SetValue(ColorProperty, value); }}
以上只是简单自定义了依赖项属性。如果想在依赖项属性变化时进行一下处理,怎么办呢?
答案是:OnPropertyChanged 回调
在上面第一步中关于元数据部分,可以使用酱紫:
new PropertyMetadata("Red",new PropertyChangedCallback(OnColorChanged))//和属性相关的元数据,及回调
OnColorChanged又是什么东东呢?
public void OnColorChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
//d 就是依赖项属性所属的对象
//e 中包含属性的新值和老值及属性名称
//属性变化时,在这里就可以做一些事情了
}