杂
Data Binding是WPF“数据驱动UI”理念的基础。
(Binding的数据源这一端,研究Binding的Source与Path)
(Binding的目标端,研究 什么样的对象才能作为Binding的Target 以及 Binding将把数据送往何处)
人类 总量 ; 人类个体 重量
对类有意义的字段和方法使用static关键字修饰,称为静态成员,通过类名加访问操作符(即“.”操作符)可以访问它们。
对类的实例有意义的字段和方法不加static关键字,称为非静态成员或实例成员。
从语义方面来看,静态成员与非静态成员有着很好的对称性,但从程序在内存中的结构来看,这种对称就被打破了。
静态字段在内存中只有一个拷贝,非静态字段则是每个实例拥有一个拷贝,无论方法是否为静态的,在内存中只会有一份拷贝,
区别只是你能通过类名来访问存放指令的内存还是通过实例名来访问存放指令的内存。
直接把数据暴露给外界的做法很不安全,很容易就会把错误的值写入字段。如果在每次写入数据的时候都先判断一下值的有效性
又会增加冗余的代码并且违反面向对象要求“高内聚”的原则,我们希望对象自己有能力判断将被写入的值是否正确。
于是,程序员仍然把字段标记为private但使用一对非private的方法来包装它。
在这对方法中,一个以Set为前缀且负责判断数据的有效性并写入数据,另一个以Get为前缀且负责把字段里的数据读取出来。
很多传统的类库使用的就是这种数据封装和访问方法(例如MFC就是这样)。
我们称这对Get/Set方法为Pprivate字段的安全包装。
使用连个方法包装一个字段的办法已然不错,但还是有些麻烦,书写的时候代码比较分散,使用的时候又要自动提示里上下翻动。
于是,当.NET Framework推出时,微软更进一步把Get/Set这对方法合并成了属性(Property)。
使用属性时,格式上很像使用非private字段,保证了语义上的顺畅,同时又不失Get/Set方法的安全性,代码变得更加紧凑,自动提示菜单也短了许多,
可谓一举多得。(Set方法不需要写参数了, 内嵌一个value变量)
这种.NET Framework中的属性又称为CLR属性(CLR,Common Language Runtime)。
我们既可以说CLR属性是private字段的安全访问包装,也可以说一个private字段在后台支持(back)一个CLR属性。
WPF(微软将属性这个概念又向前推进一步,推出了“依赖属性”这个新概念。)
简言之,依赖属性就是一种可以自己没有值,并能通过使用Binding从数据源获得值(依赖在别人身上)的属性。
拥有依赖属性的对象被称为“依赖对象“。
与传统的CLR属性和面向对象思想相比依赖属性有很多新颖之处:
■节省实例对内存的开销。
■属性值可以通过Binding依赖在其他对象上。
趣味问题
一个登山队员,他的全套装备有限多,包括登山服、登山靴、登山杖、护目镜、绳索、无线电、水、食品甚至还有氧气瓶等。
倘若是去登珠穆朗玛峰,这些装备需要都带上,要是去登香山呢?如果也背着氧气瓶岂不怪哉!所以,实际一点的办法是——用得着就带上,
用不着就不带,有必要的时候可以借别人的用一下。
WPF开发中,必须使用依赖对象作为依赖属性的宿主,使二者结合起来,才能形成完整的Binding目标被数据所驱动。