MVVM之旅
MVVM的概念已經(jīng)在腦子里滲透了一段時(shí)間,也試著使用了一段時(shí)間,就我個(gè)人理解,MVVM所倡導(dǎo)的應(yīng)該是解耦UI跟數(shù)據(jù)打交道的那一部分,而純UI的還是寫在CodeBehind里。MVVM是以綁定(綁定數(shù)據(jù)、綁定命令)來驅(qū)動(dòng)的,脫離了綁定的UI元素就沒必要使用MVVM。假設(shè)一個(gè)窗口里的button作用是關(guān)掉這個(gè)窗體,如果這樣一個(gè)動(dòng)作都要綁到命令里去,簡直就是自找麻煩。
開始MVVM之旅的第一站是實(shí)現(xiàn)INotifyPropertyChanged的接口的問題,雖然可以使用Prism或者M(jìn)VVMLight,但是這個(gè)原理還是要懂一點(diǎn)的。在M里實(shí)現(xiàn)INotifyPropertyChanged還是在VM里實(shí)現(xiàn),to be or not to be,糾結(jié)了很久。
VM其實(shí)就是V的建模,是model for view的意思,所有創(chuàng)建VM的時(shí)候是根據(jù)V來創(chuàng)建的,為V準(zhǔn)備綁定的數(shù)據(jù),提供暴露的屬性,綁定的命令等。那么問題就來了,要使數(shù)據(jù)有通知UI的能力,就必須實(shí)現(xiàn)INotifyPropertyChanged,如果在M里實(shí)現(xiàn),寫M的人就有意見了:我的M只管我自己的邏輯,不管你UI的東東。并且,在M里實(shí)現(xiàn)它,如果VM里沒有相應(yīng)的代理屬性來獲取,UI就得直接綁到“屬性的屬性”,看起來V已經(jīng)直接聯(lián)系到M了。好吧,那么就在VM里實(shí)現(xiàn)它,這樣看起來似乎清爽了,需要的話就搞M的代理屬性,在代理屬性里通知UI,UI直接來綁VM,這似乎更合理一點(diǎn)。
第二站,VM該面向什么。我上面說了一種,所有的VM都是根據(jù)V來創(chuàng)建,也有人說VM的創(chuàng)建應(yīng)該面向業(yè)務(wù),可以降低復(fù)雜性,增大復(fù)用性,因?yàn)槊嫦騇必定增加復(fù)雜性,面向V肯定降低復(fù)用性,而面向業(yè)務(wù)就能取中間的效果。目前我還是面向V,首先是因?yàn)檫@樣簡單,其次是,面向業(yè)務(wù)是可以降低復(fù)雜,增加復(fù)用,可是也是有代價(jià)的,你必須了解對(duì)項(xiàng)目、需求、甚至設(shè)計(jì)都十分了解,這樣才能抽象出復(fù)用性很強(qiáng)的業(yè)務(wù),在我沒達(dá)到那個(gè)水平之前,還是老實(shí)一點(diǎn)。再者,沒使用MVVM之前,我也沒見到哪個(gè)V的CodeBehind要去用別人的CodeBehind,在我看來,VM只是把V的CodeBehind剝離出來了而已。當(dāng)然,有些VM是顯而易見可以復(fù)用的,那就沒必要再建多建VM了,心里上感覺,內(nèi)存是是有限的,能省就省吧。
第三站,數(shù)據(jù)的更新時(shí)機(jī)。一般binding使用了twoway模式,就會(huì)及時(shí)更新了,UI有什么動(dòng)作,數(shù)據(jù)也跟著變,可是有時(shí)候也有這樣的需求,UI需要顯示地更新數(shù)據(jù),而不是自動(dòng)更新。比如我有一個(gè)窗體,上面一個(gè)文本框綁定了一個(gè)數(shù)據(jù),和一個(gè)按鈕用來關(guān)閉窗體。當(dāng)我改變了文本框的內(nèi)容的時(shí)候,我希望我點(diǎn)了關(guān)閉按鈕的時(shí)候才去更新文本框綁定的數(shù)據(jù),而不是文本框改變直接立即更新,有一種方案是UpdateSourceTrigger=Explicit,然后在后臺(tái)里得到BindingExpression,再執(zhí)行UpdateSource(),這樣就能顯示更新數(shù)據(jù)了,這樣也有個(gè)小問題,UpdateSource方法是要通過控件的BindingExpression去執(zhí)行的,那就得首先找到這個(gè)控件,這是很令人抓狂的,如果一個(gè)gridview里有一列是1000個(gè)checkbox,我得找到這1000個(gè)checkbox,然后再去更新,直接調(diào)用gridview的UpdateSource是不會(huì)更新里里面的控件的,不知道微軟是沒注意到,還是里面另有玄機(jī)我沒參透 。
轉(zhuǎn)載于:https://www.cnblogs.com/zoexia/archive/2013/06/03/3114983.html
總結(jié)
- 上一篇: hive sql 报错后继续执行_Hiv
- 下一篇: 西门子STEP7、博图里的数据块(DB)