wpf使用依赖属性完成数据绑定、动画、属性变更通知、样式化等。对于数据绑定。绑定到.NET属性源上的UI元素的属性必须是依赖属性
.net的一般属性定义如下
private int val;
public int Value
{
get
{
return val;
}
set
{
val = value;
}
}
而依赖属性的定义形式如下
public class MyDependencyObject : UIElement
{
public int Value
{
get { return (int)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
}
当然到此并没有完成依赖属性的定义,其中ValueProperty是一个DependencyProperty类型的静态成员。
其定义形式如下
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(int), typeof(MyDependencyObject),new PropertyMetadata(0,null,CoerceValue));
为了更方便理解注意看到他们的颜色已经和属性定义中的颜色对应起来了
参数含义依次为:所属属性的名称、所属属性的类型、所属属性属于哪个对象、最后一个参数的构造函数有三个参数,第一个定义属性的默认值、第二定义值变更回调和事件/第三个
定义强制值回调事件
可以定义带事件检查的参数,
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(int), typeof(MyDependencyObject),new PropertyMetadata(0,OnValueChanged,CoerceValue));
OnValueChanged是回调时间更改属性值之后调用该事件,在方法中可以获取到属性值更改的最新情况;
CoerceValue事件主要用于检查对属性的赋值是否满足要求。之两个方法的定义形式如下
private static object CoerceValue(DependencyObject element,object value)
{
int newValue = (int)value;
MyDependencyObject control = (MyDependencyObject)element;
newValue= Math.Max(control.Minimum,Math.Min(control.Maximum,newValue));
return newValue; //返回的这个值将是属性的实际值
}
private static void OnValueChanged(DependencyObject obj,DependencyPropertyChangedEventArgs args)
{
int oldValue = (int)args.OldValue; //获取属性的原来值
int newValue = (int)args.NewValue;//获取属性的最新改动值
}
通过上面例子也能体会出两个事件的各自作用