关于数据类型,有原子类型,列表类型,字典类型等等,而wpf对应控件有contentControl,itemsControl,headerItemsControl等。
控件和类型一一对应,控件和类型之间的交换则通过Binding,中间如果类型和控件需要转换可以通过Converter,交换方向则决定了Binding的mode(OneWay,TwoWay...),数据校验则通过ValidationRule等。
对于contentControl,不仅要呈现其数据,而且还需要定义如何呈现, 这时就需要style和controlTemplate。
对于itemsControl和headerItemsControl,其内部(itemTemplate)还是由contentControl组成,即由dataTemplate来实现类型和数据的转换。每个item通过itemsContainer来定义统一的外观。对于itemsControl和headerItemsControl本身的结构则同样通过controlTemplate来定义。
binding通过更改通知INotifyPropertyChanged来实现数据和类型的交换,在wpf中控件本身都是从DependencyObject继承而来,这个类提供了整个wpf的基础。
对于上述各种控件来说,还需要布局,这时就需要panel。panel决定了子控件在其内部如何布局,而子控件通过panel的各种attachedProperty来指定(比如Grid.Row, Canvas.LeftTop等等)
界面中的元素必然是和用户进行交互,这时就需要事件机制。wpf中有RoutedEvent和AttachedRoutedEvent,所谓routedEvent,有元素根部到当前触发事件的元素(管道事件),也有从当前元素上溯到根元素(冒泡事件)等。wpf中的管道事件基本上以Preview作为前缀(比如:ProviewMouseLeftButtonDown)。
从上面可以看出MVVM模式是专为wpf量身定做的三层架构,我们只要定义好自己的业务数据结构,根据数据结构选择合理的控件,通过binding来实现。