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