依赖属性允许没有自己的字段
,可以通过Binding绑定到其它对象的属性或者说数据源上,从而获得值。
缘由
由于控件有很多的属性,有属性就有字段的内存开销,但实际上对于一个控件,我们大多数只会使用其部分常用属性,比如Button我们最常使用Content,Height等属性,那些不经常使用的属性相当于白白占用着内存。当我们写一个复杂的XAML页面,涉及到很多控件的使用时,这种浪费内存的现象就很严重。
示例
public class Student: DependencyObject
{public string Name {get => (string)GetValue(NameProperty ); set => SetValue(NameProperty , value); }public static readonly DependencyProperty NameProperty =DependencyProperty.Register("Name", typeof(string), typeof(Student));
}
Register参数
1)属性名
2)属性使用的类型
3)拥有该属性的所属类型
4)PropertyMetadata对象【可选】
5)验证属性的回调函数ValidateValueCallback【可选】
PropertyMetadata
public PropertyMetadata(object defaultValue, PropertyChangedCallback propertyChangedCallback, CoerceValueCallback coerceValueCallback)
{
}
PropertyChangedCallback 属性改变触发
propertyMetadata.PropertyChangedCallback = ((s, e) =>
{Debug.WriteLine(String.Format("PropertyChanged - 属性:{0} 新值:{1} 旧值:{2}", e.Property.Name, e.NewValue, e.OldValue));
});
CoerceValueCallback 强制改变值
propertyMetadata.CoerceValueCallback = (s, e) =>
{Debug.WriteLine(String.Format("CoerceValue - {0}", e));return e;
};
ValidateValueCallback 值验证
propertyMetadata.ValidateValueCallback = (o) => {Brush brush = o as Brush;if (brush== Brushes.Yellow||brush== Brushes.Blue){return true;}else{return false;}
}