WPF是新的界面UI机制,比WinForm灵活,但是用习惯了WinForm的程序员,可能对WPF的一些技术比较陌生,这里用一些比喻来引导理解下WPF的MVVM特点和WPF的MVVM理解。
C#的WinForm里界面窗口数据是一体的,数据相当于窗口的一个属性,这个对理解MVVM不太友好,我们换个方向,在MFC的对话框里有DDX机制DoDataExchange函数,此函数负责界面上数据和控件互相转换,触发转换需要调用UpdateData函数,从这点理解WPF的MVVM就好办了,把DDX机制比喻换个名称到MVVM里,就是数据绑定,为什么要数据绑定?xaml里的界面和cs代码文件没有直接关系,是隔离开的,有了数据绑定,才能让数据显示到界面或从界面上采集数据。数据绑定位于View和ViewModel之间,但这不是MVVM的全部。
VM,即ViewModel,里面有个消息机制,注意不是Win32开发里的消息队列机制,是ViewModel通知xaml界面部分的机制,这机制如果放到整个体系里理解,就好理解了,在WinForm的CS开发体系里,S负责数据,C显示数据,S的数据到C端也肯定是要有机制的,不可能凭空去让C端刷新。
有了数据绑定和数据交换,再加上消息通知,这就是MVVM的核心,也是WinForm和MFC对话框DDX的核心,无非是WPF下换了xaml,而WinForm里是资源文件,MFC里是rc文件。但是资源文件和rc文件再怎么扩展也不如xaml形式的灵活,xaml也是抄html+css的形式,我在VS里看xaml里控件的属性窗口,和DreamWeaver里看html元素属性窗口,有似曾相似的感觉。不过xaml属性窗口内容更多,初学者也会觉得复杂。
MVVM里的M也好理解,规范了数据形式,好处理数据。
MVVM里还有很多细节,比如服务、Mediator和视图注册等等,所以一些MVVM库也应运而生,比如MVVMLight、Prism和微软的Toolkit.mvvm,有这些库支持,开发会容易一些。