程序的本质是数据加算法,
算法的分布a.数据库内部 b.读取和写回数据 c.业务逻辑 d.数据展示 e.界面与逻辑的交互
ab稳定,c与客户需求关系紧密(开发核心).d,e负责UI与逻辑的交互.
WPF让展示层处于逻辑层的从属地位.关键是引用了Data Binding以及与之配套的Dependency Property系统和DataTemplate
Binding源指数据源,一般是逻辑层的对象(object(后台),ElementName(Xaml中)).数据通过属性暴露给外界.
Source的对象:
1.把普通CLR类型单个对象指定为Source:.NET Framework自带类型的对象和用户自定义类型的对象.
2.把普通CLR集合类型对象指定为Source:包括数组,List<T>,ObservableCollection<T>等集合类型.一般把控件的ItemsSource属性使用Binding关联到一个集合对象上.例如"ItemSource=DefaultView;"(DefaultView属性是一个DataView类型的对象,DataView实现了IEnumerable接口,所以可以直接赋值给ItemSource属性)或者直接将集合的对象赋值给ItemSource
ItemTemplate属性的类型是DataTemplate
3.ADO.NET数据对象.包括DataTable和DataView:是一张DataTable的虚拟视图 ,主要用来显示数据的
4.使用XmlDataProvider把XML数据指定为source:XML作为标准的数据存储和传输格式.一些WPF控件是级联式的(如TreeView和Menu),我们可以把树状结构的XML数据作为源指定给与之关联的Binding.
5.依赖对象:依赖对象不仅可以作为Binding的目标,也可以作为Binding的源.依赖属性可以作为Binding的Path
6.容器的DataContext(Binding的默认行为)设置Binding,只设置Path而不设置Source,Binding会自己去寻找Source.(会沿着控件树一层层往外找,直到找到带有Path指定属性的对象为止)
7.ElementName.通过对象的Name属性找到对象.
8.RelativeSource属性:当空间需要关注自己的,自己的容器或者自己元素内部的某个值
9.ObjectDataProvider对象:数据源的数据通过方法暴露给外界的时候.
10,通过LINQ检索得到的数据对象作为Binding的源.
目标(Target)指UI层的控件对象
UI上的元素关心的属性称为Binding的路径(Path),即对象上有多个属性,指定所关心的属性.索引器也能作为Path来使用.当集合元素的属性仍然是一个集合,可以一路斜下去.P91页 当Bingding源本身就是数据且不需要Path来指明.XAML可以没有path,C#中写成"SetBinding(TextBlock.TextProperty,new Binding("."){Source=xxx})"
让数据源的类实现System.ComponentModel名称空间中的INotifyPropertyChanged接口
SetBinding(DependencyProperty, BindingBase)
Binding的UpdateSourceTrigger属性.可取值PropertyChanged,LostFocus,Explicit,Default
Binding的数据校验.ValidationRule类.ValidationRules是binding的属性。
实施.首先派生一个ValidationRule类。重写Validata方法。(规定校验范围)
在窗体构造器中建立Binding
ValidationRule类中ValidatesOnTargetUpdatad=true。当目标(UI层的控件)发生变化时,会影响数据源
DataContext是一个依赖属性.用法:
1.UI上多个控件都是用Binding关注同一对象时.
2.当source的对象不能被直接访问的时候.最外层容器的DataContext相当于数据制高点.只要把元素放上去,别的元素就能看见.