概念:
WPF有一套属性系统,它提供了服务扩展CLR原有的属性系统。经过扩展后的属性,以标签嵌套的方式存在于XAML里面。而这套WPF提供的属性系统,就是依赖项属性。
它是通过.net的属性过程(property procedure)进行封装的。
定义和注册:
定义依赖项属性,根据约定,要在普通的属性后面加上"Property“。
public classFrameworkElement:UIElement,IFrameworkInputElement,IInputElement,ISupportInitialize,IQueryAmbient
{
public Thickness Margin
{
get { return (Thinkness) GetValue(MarginProperty); }
set { SetValue(MarginProperty,value); }
}
//②定义依赖项属性
public static readonlyDependencyProperty MarginProperty;
FrameworkPropertyMetadata Metadata = new FramworkPropertyMetadata(new Thickness(),
FrameworkPropertyMetadataOptions.AffecttMesure);
MarginProperty = DependencyProperty.Register("Margin",//属性名称
typeof(Thickness),//属性的类型
typeof(FramworkElement),//属性的使用者
Metadata,//可选,带有附加属性的FrameworkPropertyMetadatad对象
new ValidateValueCallback(FrameworkElement,IsMarginValid));//验证的回调函数
}
private static bool IsMarginValid(object value)
{
Thinkness t = (Thinkness)value;
return t.IsValid(true,false,true,false);
}
强制属性
这里要理解一个回调函数和两个FrameworkPropertyMetadata的属性,分别是 ①ValidateValueCallback(属性验证)
②PropertyChangedCallback(值变更事件)③CoerceValueCallback(强制属性/强制事件)
注释:其中①,只能验证当前访问的属性,而③可以访问对象的多个属性。②是属性的值发生变化时,触发的事件。
触发顺序为:③,①,②