精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美经典一区二区| 91精品国产乱码久久久久久 | 欧美连裤袜在线视频| 手机av免费观看| 欧美在线三级| 在线免费观看不卡av| 特色特色大片在线| 日本在线一二三| 国产老妇另类xxxxx| 欧美中文字幕在线| 精国产品一区二区三区a片| 一区二区三区日本久久久 | 奇米成人av国产一区二区三区| 国产美女网站视频| 日韩精品福利一区二区三区| 日韩一区二区三区在线视频| 情侣黄网站免费看| 成人片在线看| 欧美韩国日本一区| 精品一区在线播放| www.蜜臀av.com| 蜜桃av噜噜一区二区三区小说| 69影院欧美专区视频| 国产免费久久久久| 欧美美女一区| 国产视频久久网| 亚洲一区二区三区四区av| 欧洲精品久久久久毛片完整版| 欧美日韩色婷婷| 国产九色porny| 日本三级韩国三级欧美三级| 国产精品久久久久婷婷二区次| 精品蜜桃一区二区三区| 亚洲国产欧美另类| 国产精品综合久久| 95av在线视频| 国产精品久久久久久久一区二区| 日韩成人伦理电影在线观看| 国产69久久精品成人| 久久精品视频久久| 欧美粗暴jizz性欧美20| 久久精品中文字幕免费mv| 欧美日韩生活片| av一区二区高清| 亚洲精品在线91| xxxx黄色片| 成人自拍小视频| 国产露出视频在线观看| 91性感美女视频| 精品午夜一区二区三区| 五月天婷婷视频| av动漫一区二区| 精品一区在线播放| 日本免费不卡| 国产日产欧美一区| 日本不卡免费新一二三区| 黄色网址在线播放| 欧美国产视频在线| 一区二区精品在线观看| 免费在线观看黄| 亚洲欧美日韩国产另类专区| 日韩一级片一区二区| 不卡av免费观看| 欧美日韩激情美女| 北条麻妃av高潮尖叫在线观看| 丝袜美腿一区| 7777精品伊人久久久大香线蕉| 五月婷婷之婷婷| 久久影院一区二区三区| 日韩欧美激情四射| 精品国产人妻一区二区三区| 亚洲成人一品| 中文字幕精品—区二区| 成年人一级黄色片| 黄色在线成人| 清纯唯美亚洲综合| 国产又粗又猛视频| 国产成人免费av在线| 国产伦精品一区二区三区四区视频| 婷婷五月综合激情| 国产免费成人在线视频| 91九色国产ts另类人妖| 波多野结衣在线观看| 色婷婷亚洲精品| 五月六月丁香婷婷| 九九热hot精品视频在线播放| 亚洲精品综合精品自拍| 国产探花在线视频| 国产日韩高清一区二区三区在线| 国产精品av在线| 99热这里只有精品9| 99国产精品99久久久久久| 亚洲免费不卡| 免费毛片b在线观看| 欧美午夜精品一区| 亚洲国产精品狼友在线观看| 国产精品欧美在线观看| 欧美久久精品午夜青青大伊人| 欧美特黄aaaaaa| 国产在线日韩欧美| 日本高清一区| h片在线观看| 欧美日韩国产另类一区| 亚洲熟女乱综合一区二区三区| 久久一区二区三区喷水| 午夜精品理论片| 国产xxxx孕妇| 日本一区二区三区在线观看| 黄色片网址在线观看| av成人在线网站| 亚洲日韩中文字幕| 久久精品国产亚洲av无码娇色 | 日韩中文字幕组| 97品白浆高清久久久久久| 深夜福利国产精品| 亚洲黄色免费观看| av不卡在线播放| 高清无码一区二区在线观看吞精| 国产精品久久久久久吹潮| 日韩成人av在线播放| 欧美成人手机视频| 精一区二区三区| 日韩精品不卡| 成人免费网站视频| 亚洲国产黄色片| 国产一级片免费观看| 精品一区二区三区欧美| 日韩videos| 日韩成人动漫| 亚洲社区在线观看| 亚洲精品男人天堂| www.色精品| 97久久国产亚洲精品超碰热| 国产精品亚洲欧美一级在线 | 乡村艳史在线观看| 亚洲激情视频网站| www.youjizz.com亚洲| 国产91丝袜在线播放0| 四虎永久免费网站| 成人国产精品久久| 精品国产欧美一区二区三区成人| 天堂网一区二区| 国产日韩精品久久久| 欧美激情成人网| 九九热爱视频精品视频| 青青草原成人在线视频| 国产在线一在线二| 色美美综合视频| 青娱乐国产视频| 日韩av中文字幕一区二区三区| 欧美少妇一区| 亚洲电影有码| 久久中文字幕一区| 国产成人精品亚洲精品色欲| 亚洲最新视频在线观看| 成年女人免费视频| 久久国产精品毛片| 日韩精品一区二区三区色偷偷 | 91免费看蜜桃| 中文字幕在线三区| 亚洲成人av在线播放| 男女啊啊啊视频| 国产日韩欧美一区二区三区综合| 免费男同深夜夜行网站| 91亚洲国产成人久久精品| 川上优av一区二区线观看| 丝袜在线视频| 日韩激情第一页| 少妇久久久久久久| 最新久久zyz资源站| 欧美午夜精品一区二区| 国产日韩一区| 亚洲欧洲精品在线 | 色综合桃花网| 亚洲最新视频在线| 国产成人久久精品77777综合| 亚洲第一主播视频| 亚洲精品色午夜无码专区日韩| 久久福利资源站| 成人免费在线网| 成人三级视频| 99久久99久久精品国产片| 桃色av一区二区| xxxx欧美18另类的高清| 理论片中文字幕| 欧美视频一区二区在线观看| 麻豆亚洲av成人无码久久精品| 91色.com| 蜜桃视频无码区在线观看| 一区二区三区福利| 在线天堂一区av电影| 红杏视频成人| 国产自摸综合网| 天堂电影一区| 美女久久久久久久久久久| 午夜小视频在线播放| 欧美日韩大陆在线| 久久免费激情视频| 亚洲欧美另类小说| 毛茸茸多毛bbb毛多视频| 久久精品国产色蜜蜜麻豆| 免费看国产一级片| 亚洲色图88| 日产精品一线二线三线芒果| 亚洲精品在线a| 国产欧美精品在线播放| 大桥未久在线播放| 久久夜色撩人精品| 国产高清在线看| 日韩成人在线免费观看| 99久久亚洲精品日本无码| 91福利资源站| 午夜毛片在线观看| 亚洲国产一区二区在线播放| 肉色超薄丝袜脚交69xx图片| 久久久久久久网| 理论片大全免费理伦片| 国产麻豆精品在线| 免费成年人高清视频| 免费在线小视频| 中日韩美女免费视频网站在线观看| www.97超碰| 欧美情侣在线播放| 国内av在线播放| 欧美午夜女人视频在线| 日韩欧美不卡视频| 亚洲综合精品久久| 免费无遮挡无码永久在线观看视频| 国产精品乱人伦中文| 能免费看av的网站| 91麻豆精品视频| 在线精品一区二区三区| 不卡一区二区三区四区| 国产黄色一区二区三区| 国产一区高清在线| 国产探花在线看| 久久精品国产第一区二区三区| 欧美伦理视频在线观看| 久久最新视频| 国产一区视频免费观看| 丝袜国产日韩另类美女| 成人免费毛片播放| 老司机精品久久| 免费激情视频在线观看| 青青草97国产精品免费观看无弹窗版| 免费午夜视频在线观看| 久久一本综合频道| 国内自拍视频网| 卡一卡二国产精品| 一级黄色高清视频| 国产伦精一区二区三区| 国产亚洲精品成人a| 成人一二三区视频| 少妇激情一区二区三区视频| 99久久伊人网影院| 亚洲精品国产91| 国产精品网友自拍| 黄色片在线观看网站| 亚洲一线二线三线久久久| 国产成人啪精品午夜在线观看| 欧美日韩另类在线| 高潮毛片又色又爽免费 | 国产精品欧美一级免费| 国产日韩精品中文字无码| 最新日韩在线视频| 国产在线综合网| 色综合天天综合在线视频| 国产精品成人久久久| 69成人精品免费视频| 亚洲av无码专区在线| 日韩激情av在线播放| 国产区av在线| 两个人的视频www国产精品| 激情网站在线| 日本一区二区三区在线播放| 色婷婷成人网| 国产精品一区二区免费| 精品国产一区一区二区三亚瑟| 中文字幕欧美人与畜| 日韩天堂av| 中文字幕国产免费| 成人黄色小视频在线观看| 99久久人妻无码精品系列| 亚洲视频小说图片| 二区视频在线观看| 欧美理论电影在线| 视频二区在线观看| 日韩最新av在线| av在线加勒比| 国产精品一区二区电影| 国产美女撒尿一区二区| 色综合久久88色综合天天提莫| 国产一区欧美| 国产野外作爱视频播放| av在线综合网| 国产精品麻豆一区| 日韩欧美高清视频| 国内精品久久久久久久久久久 | 国产亚洲一区在线| 色乱码一区二区三区在线| av不卡在线观看| 欧美丰满熟妇bbbbbb| 欧美性欧美巨大黑白大战| 成人无码一区二区三区| www.日韩.com| 日韩中文影院| 久久大香伊蕉在人线观看热2| 亚洲综合中文| 黄色永久免费网站| 久久久久久久一区| 久久露脸国语精品国产91| 欧美一级在线免费| 午夜视频成人| 国产精品高清网站| 天堂av一区二区三区在线播放| 久久99精品国产99久久6尤物| 1024手机在线观看你懂的| 亚洲精品videosex极品| 亚洲视频久久久| 亚洲欧美日本精品| 国产黄大片在线观看| 成人动漫在线观看视频| 91精品久久久久久久蜜月| 我看黄色一级片| 久久久久九九视频| 欧美精品亚洲精品日韩精品| 精品欧美一区二区三区精品久久 | 欧美激情一二三区| 91精品国产高清一区二区三密臀| 亚洲精品一区二区三区福利| 午夜伦理大片视频在线观看| 91最新在线免费观看| 国产精品成人a在线观看| 国产视频手机在线播放| 久久久99免费| 四虎影院在线免费播放| 亚洲人成亚洲人成在线观看| 性欧美超级视频| 日本一区二区三区四区高清视频 | 波多野吉衣在线视频| 一区在线播放视频| 一级黄色免费片| 久久激情五月丁香伊人| 韩国精品视频在线观看 | 日韩av官网| 91国产丝袜在线放| 亚洲午夜黄色| 亚洲黄色免费在线观看| 色综合中文字幕国产| 加勒比一区二区三区在线| 国产精品69久久| 日韩av在线中文字幕| 污污的视频免费观看| 岛国最新视频免费在线观看| xvideos亚洲| 国产高清日韩| 国产真人做爰毛片视频直播| 成人av电影在线网| a v视频在线观看| 精品亚洲精品福利线在观看| 婷婷六月国产精品久久不卡| 亚洲国内在线| 国产乱码精品一区二区三区忘忧草 | 欧美大黑帍在线播放| av电影一区二区| 无码人妻丰满熟妇区bbbbxxxx| 伊人久久精品视频| 国产精久久久| 免费观看美女裸体网站| 国产色综合一区| 国产三级按摩推拿按摩| 欧美激情视频一区二区三区不卡| 欧美变态挠脚心| 99热这里只有精品在线播放| 亚洲人妖av一区二区| 搡老岳熟女国产熟妇| 国产精品久久久久77777| 久久久久久美女精品 | 国产男女激情视频| 国产精品久久久久三级| 亚洲国产欧美另类| 国产97在线|日韩| 亚洲精品一区二区在线看| 男人的天堂影院| 欧美三级电影一区| av手机在线观看| 亚洲国产日韩美| 成人免费视频免费观看| 一区二区视频播放| 午夜精品久久久久久久99热浪潮| 大片网站久久| 中文字幕第3页| 欧美乱妇15p| 欧美黑人疯狂性受xxxxx野外| 国产一二三四区在线观看| 国产性色一区二区| 无码国产伦一区二区三区视频| 国产日韩在线视频| 亚洲女人av| 精品处破女学生|