WPF学习之--属性,依赖属性和依赖对象
一、属性的来龙去脉
程序的本质是“数据+算法”
C#语言规定:对类有意义的字段和方法使用static关键字修饰,称为静态成员;
静态字段在内存中只有一个拷贝,非静态字段则是每个实例拥有一个拷贝,无论方法是否为静态在内存中只会有一份拷贝。
使用属性的目的就是为了避免把数据直接暴露给外界。
属性就是Get和Set这对方法。
二、CLR属性
.NET Framework中的属性又称为CLR属性,是private字段的安全访问包装,本质是将一个类中的字段进行封装,以达到控制字段取值以及赋值的目的。
public class Student { public int id; public string name; public int age; } //年龄不可能为负值 public class Student { public int ID { get; set; } public string Name { get; set; } private int age; public int Age { get { return age; } set { if (value > 0) { age = value; } } } }
值得注意的是,WPF的Binding中Path的必须是CLR属性。
三、依赖属性
是一种可以自己没有值,并能通过使用Binding从数据源获得值的属性。
1.节省实例对内存的开销;
在传统的.Net开发中,每一个类对象一旦被创建,它的所有字段也就被分配了存储空间。WPF允许对象在创建时,不包含各个字段所占用的空间,而在使用这个字段时通过其他对象的数据或者实时分配空间,这种对象就是依赖对象,而它这种实时获取数据能力就是依靠依赖属性来实现。
WPF中支持依赖对象的类,需要继承自DependencyObject,依赖属性的类需要继承自DependencyProperty。DependencyObject具有GetValue和SetValue两个方法,其都是以DependencyProperty对象为参数,用于读取和存储依赖属性对象的值,DependencyObject是WPF中很底层的一个基类,WPF所有UI控件都是依赖对象。
public class Student:DependencyObject { public object GetValue(DependencyProperty dp) { ... } public object SetValue(DependencyProperty dp,object value) { ... } }
2.属性值可以通过Binding依赖在其他对象上。
public class Student:DependencyObject { public string Name//CLR属性外包装 { get { return (string)GetValue(NameProperty); } set { SetValue(NameProperty, value); } } // Using a DependencyProperty as the backing store for Name. This enables animation, styling, binding, etc... public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Student)); }
如代码所示,
依赖对象的继承自DependencyObject类,
成员变量被public static readonly DependencyProperty 修饰,
依赖属性的命名规范是“包装器+Property”。
它的实例由DependencyProperty.Register创建。
private void Button_Click(object sender, RoutedEventArgs e) {
Student stu = new Student();
stu.Name = this.TextBox1.Text;
TextBox2.Text = stu.Name;
}
上述所示就是利用依赖属性来存储值并把值读取出来,注意这样子的写法是因为用了CLR属性外包装,这样依赖属性使用时与普通的CLR属性别无二致。
尽管Student类(依赖对象)没有实现INotifyPropertyChanged接口,当属性的值发生变化时,与之关联的Binding对象依然可以得到通知,依赖属性默认带有这样的功能