WPF是新的界面UI機(jī)制,比WinForm靈活,但是用習(xí)慣了WinForm的程序員,可能對(duì)WPF的一些技術(shù)比較陌生,這里用一些比喻來(lái)引導(dǎo)理解下WPF的MVVM特點(diǎn)和WPF的MVVM理解。
C#的WinForm里界面窗口數(shù)據(jù)是一體的,數(shù)據(jù)相當(dāng)于窗口的一個(gè)屬性,這個(gè)對(duì)理解MVVM不太友好,我們換個(gè)方向,在MFC的對(duì)話框里有DDX機(jī)制DoDataExchange函數(shù),此函數(shù)負(fù)責(zé)界面上數(shù)據(jù)和控件互相轉(zhuǎn)換,觸發(fā)轉(zhuǎn)換需要調(diào)用UpdateData函數(shù),從這點(diǎn)理解WPF的MVVM就好辦了,把DDX機(jī)制比喻換個(gè)名稱到MVVM里,就是數(shù)據(jù)綁定,為什么要數(shù)據(jù)綁定?xaml里的界面和cs代碼文件沒(méi)有直接關(guān)系,是隔離開(kāi)的,有了數(shù)據(jù)綁定,才能讓數(shù)據(jù)顯示到界面或從界面上采集數(shù)據(jù)。數(shù)據(jù)綁定位于View和ViewModel之間,但這不是MVVM的全部。
VM,即ViewModel,里面有個(gè)消息機(jī)制,注意不是Win32開(kāi)發(fā)里的消息隊(duì)列機(jī)制,是ViewModel通知xaml界面部分的機(jī)制,這機(jī)制如果放到整個(gè)體系里理解,就好理解了,在WinForm的CS開(kāi)發(fā)體系里,S負(fù)責(zé)數(shù)據(jù),C顯示數(shù)據(jù),S的數(shù)據(jù)到C端也肯定是要有機(jī)制的,不可能憑空去讓C端刷新。
有了數(shù)據(jù)綁定和數(shù)據(jù)交換,再加上消息通知,這就是MVVM的核心,也是WinForm和MFC對(duì)話框DDX的核心,無(wú)非是WPF下?lián)Q了xaml,而WinForm里是資源文件,MFC里是rc文件。但是資源文件和rc文件再怎么擴(kuò)展也不如xaml形式的靈活,xaml也是抄h(huán)tml+css的形式,我在VS里看xaml里控件的屬性窗口,和DreamWeaver里看html元素屬性窗口,有似曾相似的感覺(jué)。不過(guò)xaml屬性窗口內(nèi)容更多,初學(xué)者也會(huì)覺(jué)得復(fù)雜。
MVVM里的M也好理解,規(guī)范了數(shù)據(jù)形式,好處理數(shù)據(jù)。
MVVM里還有很多細(xì)節(jié),比如服務(wù)、Mediator和視圖注冊(cè)等等,所以一些MVVM庫(kù)也應(yīng)運(yùn)而生,比如MVVMLight、Prism和微軟的Toolkit.mvvm,有這些庫(kù)支持,開(kāi)發(fā)會(huì)容易一些。