依赖属性允许没有自己的字段,可以通过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; } }
还没有评论,来说两句吧...