精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

WPF中MVVM模式原理分析與實踐

開發 開發工具
"設計模式"這樣的話題似乎快被園子里的兄弟們寫透了, 從簡單的工廠到 MVC, MVP. 而關于MVVM似乎談論得相對少些, 今天簡單地說說。

1, 前提

可以說MVVM是專為WPF打造的模式, 也可以說MVVM僅僅是MVC的一個變種, 但無論如何, 就實踐而言, 如果你或你的團隊沒有使用"Binding"的習慣, 那么研究MVVM就沒有多大意義.
另外,個人覺得, 使用Command以及打造一種合理的簡化的方式去使用Command也與使用Binding一樣重要.

2, 誕生

為了解決現實世界中的問題,我們需要將現實世界中的事物加以抽象, 然后得到了Domain Object, 無論貧血的還是富血的, 我們都可以簡單地把他們歸結為"由現實世界抽象出來的模型", 也就是我們的model, 也就M-V-VM中的"M"。

但其無法與我們的用戶進行交互, 所以, 我們需要為其創建一個界面(視圖, View), 該視圖可以與用戶輸入設備進行交互, 這很棒, 但問題是如何將View與我們的model關聯起來? Binding便可以發揮作用了, 比如視圖上的某一個文本框中的文本和Model中的"用戶名"關聯起來, 用戶便可以通過操作該文本框來訪問和修改Model的"用戶名"了。

這是極其簡單的情況, 但實際編程時我們發現, Model中的屬性(與方法)往往不那么容易與View中的界面控件關聯起來, 比如, "類型不匹配": 界面控件所需要的類型與模型中屬性提高的類型不匹配. "需要額外操作": 模型中的數據需要經過一些額外的處理才能傳給視圖,反之亦然.  此時, 我們意識到View似乎需要一個"Helper"類來處理一些額外工作.
這個helper所包含的代碼可以放在除了Model外的很多地方(我們現在不考慮貧血富血之類的爭論), 比如View中, 記得自己剛學習窗體程序開發時就是這么干的, 將絕大多數處理邏輯放在那個所謂的CodeBehind中. 后來,正如大家在各種設計模式書籍中所看到的一樣,為了將View和Model剝離開來,實現view可替換(比如你可以講自己精心設計的軟件同時運行于窗體程序,Web甚至Mobile上), 便有了MVC. 有了MVC以后似乎就開始滋生M-V-XXX之類的爭論與變種模型, 比如MVP以及這里的MVVM,甚至MVP也有著Supervising Controller與Presentation Model兩種方式. 但主要圍繞兩個問題,一是model與view之間的關系, 完全隔離的?單向的還是雙向的? 二是這個"XXX"需要完成哪些功能,簡單流程調度?復雜規則處理? OK,這些爭論都沒有關系, 是否采用某種模式取決于你的開發所處的環境(比如語言特性,框架特性)以及你的業務特性以及所面臨的主要變化點等等。

但與MVC,MVP所不同的是,MVVM的引入不僅僅是技術上的原因(解除耦合應對變化等老生常談),另外一個很大原因是:軟件團隊開發方式的改變.如果你做過一段時間的WPF項目開發的話,你可能會有比較明顯的感覺:在View層打造上,如何分配程序員和美工的工作.在繼續閱讀之前,大家可以看看我以前的一篇文章"在UI Designer與Developer之間". 以前我們團隊采用的便是"集成模式", 我便兼職了其中的"Integrator"角色.這還不錯.但說實在的,這僅僅是一個在特殊情況下不得已而為之的暫時方案,所以我們付出了很大的努力開始轉向"收割模式"了,要轉向這個模式,至少需要兩個基本條件:

(1)你擁有能夠熟練運用Blend等工具能為程序員輸出XAML的美工, 他專注于純粹的UI/UE, 另外他還必須具有一定的"程序員"思維.以便輸出的東西能很好地作為程序的一部分而運轉起來,而不是僅僅"看上去"是那樣的。

(2)你需要能夠脫離View層但仍能編寫出高質量代碼的程序員。

幸運的是, 我們在努力創造條件1,并取得了很好的效果.(你可以招一個具有Flash腳本編寫經驗的并且有極大的學習熱情的美工人員, 并對他進行Blend的相關培訓). 而MVVM模式為我們實現第二個條件提供了極大的便利. 為什么MVC/MVP模式不行而MVVM可以呢? 很簡單, 在MVC和MVP模式中, View層都具有很多代碼邏輯, 開發View層的是程序員, 雖然UI/UE團隊會做很多工作, 但這個層的"實現者"仍然是程序員. 在以前的開發中,其工作得很好, 而在WPF開發中程序員對View層的展現顯得力不從心了,美工(指符合上面條件1的美工)雖然很擅長, 但他會說"可惜我不會程序".于是, 我們需要一種方式將View層的代碼邏輯抽取出來,并View層很純粹以便完全讓美工去打造它.相應地, 需要將View層的相應邏輯抽取到一個代碼層上,以便讓程序員專注在這里。

回想一下, 我們只所以要在View(Xaml)背后寫一些代碼(C#), 無非是想傳遞一些數據以及傳遞數據時的數據的處理或在用戶與界面控件進行交互時執行一些操作, 最簡單的例子是在MVC中當界面發生交互時View去調用Controler中的某個方法, 以便將該操作的相應"指示"傳遞到"后臺"去. 在以前的技術中, 這樣的"銜接性"的代碼是必須的. 而在WPF中, 則可以通過另外的技術來進行層與層之間的"銜接", 這就是"Binding" 和"Command", 以及稍后我們會提到的"AttachBehavior". 通過Binding, 我們可以實現數據的傳遞; 通過Command, 我們可以實現操作的調用.(AttachBehavior的作用稍后再談). Binding和Command是可以寫在XAML中的, 這樣看來XAML后面對于的CS文件可以被完全拋棄或不予理會了. 這樣的XAML文件正是美工所需要的. 而這些對于Binding以及Command的定義描述以及其他相關信息的代碼應該放在那里呢, 當然不是View, 更不是Model, 是"ViewModel". ViewModel是為這個View所量身定制的, 它包含了Binding是所需的相關信息,比如Converter以及為View的Binding提供DataContext, 它包含了Command的定義以便View層可以直接使用, 另外,它還是一個變種的Controler, 它得負責業務流程的調度。

于是, 便有了這副圖, 然后, 正如"時勢造英雄"所言, MVVM就誕生了.

3, ViewModel 與單元測試

如果你是一名正在使用MVVM模式打造軟件的程序員, 那么我勸你盡快忘掉View. 你所面對的是這樣一個模式"UnitTest-ViewModel-Model"(這并非一個模式, 僅僅是我為闡述觀點而暫時如此表述的)。

記得曾經有一個Model-View-AbstractView模式, 而MVVM中的VM實際也是一個AbstractView: the abstraction of view. 它是一個抽象的View, 具有一個View的靈魂,而不具備相應的可視化控件而已. 所以對于程序員而已, 打造這樣一個抽象的VM就可以認為是完成View層的打造了.而當美工完成無數控件組成的實際的View后, 我們就可以用Binding和Command這樣的黏合劑將這個抽象的View和實際的View黏合在一起了。

那么在黏合之前, 我們怎么知道自己的VM是否正常工作呢? 單元測試!

在說明對于ViewModel進行單元測試的重要性之前, 送給大家一句話: "View and Unit Test are just two different types of ViewModel consumers" (Josh Smith). 如果我們將ViewModel看作生產者, 那么View和Unit Test都是具有同等地位的消費者而已. 并且UnitTest相比于View而言具備更大的消費能力. 或者你可以簡單的認為View也僅僅是一種不太推薦的測試方式而已. 所以要實施好這個模式, 那么對ViewModel的單元測試就是必須的了,并且這個測試要不依賴于任何UI控件. (那么不是不對應ViewModel的開發是不是就應該通過測試來驅動了?TDD?)

4, AttachBehavior

一般情況下利用Command, Binding, AttachProperty等WPF特性, View和ViewModel之間能配合工作得很好.  假設我們有一個Button, 當該Button被點擊的時候我們要完成一些操作, 很簡單, 將該操作封裝成一個Command并綁定到該Button上就可以了, 但如果我們要在Button被Load的時候執行另外一些操作呢?  由于Button沒有直接被Load事件所觸發的Command, 所以不能使用Command了. 不能直接將Load事件處理器寫在Button所在的Xaml所對應的CS文件里, 這和我們剛才對MVVM的設計是相矛盾的. 一個不太好的方案是繼承一下Button, 并撰寫一個由Load所觸發的Command, 這可行, 但明顯不好. 正如一個控件沒有某個屬性并且在不繼承的情況下而采用AttachProperty一樣, 我們可以采用AttachBehavior. AttachBehavior不是WPF特性, 它僅僅是一個***實踐, 一個Pattern. 關于AttachBehavior語法如何書寫, 請參考 : http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx

【編輯推薦】

  1. Visual Studio 2010截圖曝光 以WPF開發UI
  2. 為WPF項目創建單元測試
  3. 詳解Silverlight和WPF互相擴展
  4. 教你如何理解WPF中的Template類
  5. 詳談WPF開發中的數據虛擬化
責任編輯:彭凡 來源: 博客堂
相關推薦

2021-01-21 05:50:28

MVVM模式Wpf

2009-12-24 14:30:19

WPF MVVM

2024-04-19 08:38:36

WPFMVVM設計模式

2018-03-22 19:48:47

前端HTML5數學知識

2017-08-15 17:06:55

前端HTML5手勢原理

2013-04-24 10:13:22

視頻監控光端機視頻網絡技術

2020-05-22 09:12:46

HTTP3網絡協議

2024-06-19 16:02:46

2012-05-28 10:34:50

MVVM 數據綁定

2012-04-05 11:35:07

.NET

2024-04-11 11:04:05

Redis

2025-02-06 08:24:25

AQS開發Java

2009-06-08 16:52:00

2017-04-17 15:48:15

Cinder備份實踐

2024-05-10 11:35:22

Redis延時隊列數據庫

2025-02-08 08:10:00

2023-11-29 16:21:30

Kubernetes服務注冊

2014-12-11 13:37:13

WPF架構

2017-07-17 15:19:10

MVVM模式iOS開發MVP

2013-07-31 13:13:50

Windows PhoMVVM模式
點贊
收藏

51CTO技術棧公眾號

波多野结衣电影免费观看| 电影午夜精品一区二区三区 | 日韩av中字| 中国av一区二区三区| 7777奇米亚洲综合久久| 国产精品久久久久久人| 91久久国产| 日韩第一页在线| 欧美日韩在线观看不卡| 19禁羞羞电影院在线观看| 99精品视频中文字幕| 国产欧美一区二区白浆黑人| 日本最新中文字幕| 天天射天天综合网| 亚洲毛片在线看| 香蕉视频免费网站| 国产精品无码久久久久| 福利精品视频在线| 精品嫩模一区二区三区| 国产午夜在线视频| 99视频一区二区| 91亚洲国产成人精品性色| 中文字幕日韩免费| aa亚洲婷婷| 久久99精品久久久久久噜噜| 男人天堂资源网| 国产一区二区三区四区大秀| 亚洲黄色成人网| 日本黄色三级网站| 99精品国产九九国产精品| 日本精品一级二级| 可以在线看的av网站| 天堂av中文在线| 亚洲人成影院在线观看| 欧美自拍资源在线| 亚洲欧美日韩免费| 成人18视频日本| 国产高清一区视频| 性生交大片免费看女人按摩| 国产一区二区导航在线播放| 国产欧美韩国高清| 中文字幕丰满人伦在线| 日韩国产欧美在线播放| 国产91精品在线播放| 日本特级黄色片| 99热免费精品在线观看| 久久久免费精品视频| 黄页网站免费观看| 欧美日韩四区| 欧美激情一区二区久久久| 亚洲av鲁丝一区二区三区 | 真人抽搐一进一出视频| 青春草免费在线视频| 亚洲综合色噜噜狠狠| 日本久久久网站| 蜜桃传媒在线观看免费进入| 亚洲图片有声小说| av在线播放亚洲| 性欧美freesex顶级少妇| 精品免费在线观看| 女性隐私黄www网站视频| 欧美电影免费观看网站| 欧美在线一二三四区| 性欧美videossex精品| 成人交换视频| 日韩欧美一卡二卡| 国产午夜在线一区二区三区| 日本在线中文字幕一区| 亚洲人成免费电影| 四虎影视1304t| 女同性一区二区三区人了人一| 欧美国产日韩在线| 欧美videossex极品| 日本在线观看不卡视频| 91人成网站www| 色窝窝无码一区二区三区成人网站 | 一区二区三区免费在线观看| 分分操这里只有精品| jk漫画禁漫成人入口| 欧美三级视频在线观看| 欧美高清精品一区二区| 精品少妇一区| 中文字幕久久久| 亚洲av无码一区二区三区在线| 亚洲天堂黄色| 国产精品久久久久久搜索| 国产免费一区二区三区最新不卡| 成人三级伦理片| 欧美三级网色| 性欧美videoshd高清| 色网综合在线观看| 日本黄色三级网站| 禁果av一区二区三区| 成年人精品视频| 在线观看日韩中文字幕| 国内精品久久久久影院色| 精品国产一区二区三区四区精华 | 国产巨乳在线观看| 99re这里只有精品6| 一区二区三区视频在线播放| 丁香花高清在线观看完整版| 欧美写真视频网站| 男女一区二区三区| 午夜精品视频一区二区三区在线看| 久久久久久久久中文字幕| 中文字幕一区二区三区波野结| 成人涩涩免费视频| 国产免费一区二区三区四在线播放| 蜜桃麻豆影像在线观看| 欧美一区二区三区免费在线看| 醉酒壮男gay强迫野外xx| 自拍日韩欧美| 国产在线久久久| 欧美人体大胆444www| 亚洲资源在线观看| 亚洲一区精品视频在线观看| 伊人久久大香线蕉av不卡| 欧美激情精品久久久久久黑人| 最新中文字幕第一页| 99久久婷婷国产综合精品电影| 今天免费高清在线观看国语| 韩日一区二区| 亚洲毛片一区二区| a√中文在线观看| 91精品国产色综合久久ai换脸| 精品人妻少妇嫩草av无码| 国产精品红桃| 51国偷自产一区二区三区的来源| 国产福利第一视频在线播放| 黄色91在线观看| 国产综合内射日韩久| 在线国产一区| 91热福利电影| 黄色成人在线| 欧美精品自拍偷拍| 亚洲精品国产精品乱码在线观看| 日韩精品亚洲专区| 日韩不卡av| 久久天堂av| 中文字幕欧美日韩| 91国偷自产中文字幕久久| 亚洲国产成人午夜在线一区 | 伊人久久久久久久久久久久久久| 日韩成人精品在线观看| 青青草成人网| 91精品美女| 中文字幕综合一区| 中文字幕精品一区二区精| 国产欧美精品国产国产专区| 激情五月婷婷久久| 91亚洲人成网污www| 91精品国产自产在线| 黄色网址在线免费观看| 欧美一区二区三区视频| 国产无遮无挡120秒| 99久久国产综合精品色伊| 国产精品50p| 欧美人与拘性视交免费看| 国产成人精品电影久久久| 国产视频三级在线观看播放| 欧美午夜精品一区二区三区| 国产亚洲精品久久久久久豆腐| 久久99蜜桃精品| 在线观看17c| 乱中年女人伦av一区二区| 欧美专区第一页| 韩国三级在线观看久| 欧美日韩激情一区| 欧美成人片在线观看| 99这里只有久久精品视频| 欧美xxxxx在线视频| 久久美女视频| 国产91精品入口17c| 一个人看的www视频在线免费观看| 亚洲区免费影片| 国产露脸91国语对白| 午夜一区二区三区视频| 国产精品免费无码| 国产美女精品一区二区三区| 欧美一级片免费播放| 国产一区二区三区四区五区传媒| 91精品在线国产| 手机在线观看av网站| 中文字幕日韩在线观看| www五月婷婷| 色综合天天综合| 五月天激情丁香| 91视视频在线观看入口直接观看www | 僵尸世界大战2 在线播放| 国产一区三区在线播放| 2022国产精品| 九九热线视频只有这里最精品| 精品国产区一区二区三区在线观看| 人妻中文字幕一区| 欧美日韩三级一区| 成年人午夜视频| 国产精品成人一区二区艾草| 亚洲激情 欧美| 国模少妇一区二区三区| 日韩 欧美 高清| 亚洲夜间福利| 欧美日韩视频免费在线观看| 亚洲桃色综合影院| av在线不卡观看| 福利一区二区免费视频| 国产综合在线视频| 操你啦在线视频| 怡红院精品视频| 在线观看xxx| 日韩精品一区二区三区视频| 中文字幕在线观看你懂的| 精品欧美aⅴ在线网站| 精品国产精品国产精品| 国产欧美日韩亚州综合| 亚洲av无码一区二区三区观看| 狠狠色狠狠色综合系列| 制服丝袜综合网| 久久婷婷av| 中文字幕无码精品亚洲35| 欧美日韩国产高清| 精品少妇人妻av一区二区| 日韩黄色大片| 欧美重口乱码一区二区| 五月综合久久| 激情伦成人综合小说| 国产成人澳门| 懂色一区二区三区av片| 欧美久久亚洲| 亚洲影院色在线观看免费| 日本黄色成人| 国产精品欧美一区二区| 日韩成人亚洲| 国产第一区电影| 在线一区视频观看| 国产精品久久久久久久久久小说| 成人教育av| 日本a级片电影一区二区| 色网在线免费观看| 琪琪第一精品导航| 成人免费直播| 国产精品久久久久久五月尺| 欧美日韩五区| 成人国产精品一区二区| 久久国产精品美女| 99re国产| 国内精品国产成人国产三级粉色 | 人人妻人人澡人人爽精品日本| 日韩欧美中文字幕公布| 亚洲第一第二区| 亚洲成色999久久网站| 欧美一区二不卡视频| 亚洲第一区第二区| 亚洲欧美日韩成人在线| 国产亚洲a∨片在线观看| 成人在线高清视频| 精品国偷自产在线视频| а√天堂8资源在线官网| 欧美激情一二区| 中文一区一区三区高中清不卡免费| 欧美主播福利视频| 日韩黄色在线| 97人人澡人人爽| 欧美人体视频| 五月天亚洲综合情| 欧美日韩精品一本二本三本 | 高清成人免费视频| 人妻丰满熟妇aⅴ无码| 国产欧美一区二区三区网站| 我要看黄色一级片| 亚洲午夜精品在线| 五月天激情四射| 欧美精品自拍偷拍| 四虎永久在线精品免费网址| 一区二区三区视频观看| 中文字幕有码在线视频| 欧洲亚洲女同hd| 国产aⅴ精品一区二区四区| 国产手机精品在线| 成人婷婷网色偷偷亚洲男人的天堂| 只有这里有精品| 宅男噜噜噜66一区二区| 手机视频在线观看| 成人精品小蝌蚪| 精品手机在线视频| 午夜日韩在线观看| 一级做a爱片性色毛片| 亚洲成人亚洲激情| 欧美成人hd| 热久久免费国产视频| 久久视频免费| 奇米888一区二区三区| 国产一区清纯| 国产精品区在线| 91尤物视频在线观看| 全网免费在线播放视频入口| 欧美性色视频在线| 精品人妻伦一区二区三区久久| 亚洲欧美制服第一页| 男女羞羞视频在线观看| 国产精品视频网站| 蜜桃精品噜噜噜成人av| 天堂8在线天堂资源bt| 久久99久久99精品免视看婷婷| www.色多多| 亚洲成人福利片| 国产精品午夜福利| 亚洲无av在线中文字幕| 51精品视频| 91传媒视频在线观看| 日韩av专区| 日本在线观看a| aaa亚洲精品| 免费毛片一区二区三区| 91精品国产乱| 日本网站在线免费观看视频| 国产91露脸中文字幕在线| 国产一区二区三区不卡av| 日本免费黄色小视频| 加勒比av一区二区| 成人一级片免费看| 色视频欧美一区二区三区| 手机在线不卡av| 欧美精品成人在线| 蜜桃精品一区二区三区| 中文字幕日韩精品一区二区| 琪琪一区二区三区| 欧美日韩中文字幕视频| 色综合亚洲欧洲| 三级理论午夜在线观看| 97成人精品区在线播放| 好吊妞国产欧美日韩免费观看网站 | 美女国产在线| 国产日韩中文字幕在线| 久久在线播放| 爱豆国产剧免费观看大全剧苏畅| 欧美国产成人精品| 亚洲一区二区激情| 精品国产网站地址| 日本一区影院| 91视频 - 88av| 高清shemale亚洲人妖| 国产 日韩 欧美 成人| 精品久久久久久无| 极品在线视频| 免费亚洲一区二区| 视频一区在线视频| 粉嫩精品久久99综合一区| 欧美日韩免费高清一区色橹橹 | 992kp免费看片| 亚洲品质自拍视频网站| 草草视频在线播放| 久久久久久18| 偷拍亚洲精品| 国产aaaaa毛片| 邻居大乳一区二区三区| 中文日韩在线观看| 亚洲精品一区av| 成年人视频大全| 波多野结衣亚洲一区| 男人午夜免费视频| 亚洲性无码av在线| 亚洲国产91视频| 青青青青在线视频| 91视频91自| 岳乳丰满一区二区三区| 免费av在线一区| 国产精品流白浆在线观看| 欧美日韩在线视频一区二区三区| 久久久精品国产免费观看同学| 亚洲系列在线观看| 欧美激情国产精品| 视频一区欧美| 亚洲三级在线视频| 亚洲成a天堂v人片| www在线免费观看| 91传媒视频免费| 羞羞答答国产精品www一本 | 亚洲自拍偷拍av| 男人天堂网在线观看| 国产色婷婷国产综合在线理论片a| 欧美人成在线| 国内精品久久99人妻无码| 欧美妇女性影城| 日本蜜桃在线观看视频| 一本一道久久a久久精品综合 | 日本二区在线观看| 欧美绝品在线观看成人午夜影视| 波多野结依一区| 亚洲成人午夜在线| 成人黄色网址在线观看| 中文字幕乱码中文字幕| 国内揄拍国内精品少妇国语| 成人影视亚洲图片在线| 在线xxxxx| 欧美精品国产精品| 高潮一区二区| 国产美女在线一区| 成人免费小视频| 久久精品a一级国产免视看成人 | 欧美色女视频|