<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      MVVM模式解析和在WPF中的實(shí)現(xiàn)(六) 用依賴注入的方式配置ViewModel并注冊消息

      MVVM模式解析和在WPF中的實(shí)現(xiàn)(六)

      用依賴注入的方式配置ViewModel并注冊消息

      系列目錄:

      MVVM模式解析和在WPF中的實(shí)現(xiàn)(一)MVVM模式簡介

      MVVM模式解析和在WPF中的實(shí)現(xiàn)(二)數(shù)據(jù)綁定

      MVVM模式解析和在WPF中的實(shí)現(xiàn)(三)命令綁定

      MVVM模式解析和在WPF中的實(shí)現(xiàn)(四)事件綁定

      MVVM模式解析和在WPF中的實(shí)現(xiàn)(五)View和ViewModel的通信 

      MVVM模式解析和在WPF中的實(shí)現(xiàn)(六)用依賴注入的方式配置ViewModel并注冊消息

      0x00 最初的想法

      這次主要討論下給View指定ViewModel的事情。一般來說給View指定ViewModel常用的方式有兩種,一種是在View的后臺代碼中寫DataContext = new ViewModel(),還有一種是在XAML中指定View的DataContext。這兩種方式都使得View對ViewModel產(chǎn)生了依賴,這種情況下可以考慮用依賴注入的方式使取消View對ViewModel的直接依賴。依賴注入一般來說可以通過構(gòu)造函數(shù)注入、通過設(shè)置屬性注入,這兩種方法對于View來說都不合適。因此可以使用IoC Container,讓View主動去獲取對應(yīng)的ViewModel。

      其實(shí)給View指定一個ViewModel并不屬于頻繁的操作,而且改起來也很容易,費(fèi)半天勁搞個依賴注入確實(shí)不太至于。就像上篇文章中廢了半天勁搞了個View和ViewModel的通信一樣,用到的概率比較小,而且也有別的方式解決,雖然那種方式并不符合MVVM模式。不過View除了依賴ViewModel之外對消息注冊器也是會產(chǎn)生依賴的,而且某種類型的View一般來說都依賴固定類型的ViewModel和消息注冊器,因此可以一次注入兩個依賴,這樣貌似就值了,至少我認(rèn)為是值了,所以有了ViewModelManager這個類。

      0x01 ViewModel和MessageManager的依賴注入

      使用靜態(tài)類ViewModelManager來當(dāng)作IoC Container。往IoC Container里注冊依賴關(guān)系一般有兩種方式,一種是將依賴關(guān)系以某種形式(例如xml)保存在外部,一種是在程序中注冊到一個列表里。我采取第二種做法,因?yàn)楸容^容易:)

      程序在啟動時使用ViewModelManager.Register將依賴關(guān)系注冊到ViewModelManager中,View在構(gòu)造函數(shù)中調(diào)用ViewModelManager.SetViewModel(this);來設(shè)置View的DataContext并通過依賴的消息注冊器注冊消息,消息注冊器可以為空,代表View不接收消息。它們的關(guān)系如圖所示:

       

      需要說明的有兩個地方:

      一個是View和ViewModel的對應(yīng)關(guān)系。一般來說一個View對應(yīng)著一種ViewModel,這樣注冊起來是沒問題的。但這個并不絕對,理論上來說一個View可以將DataContext設(shè)置為任意ViewModel,如果一個View可以設(shè)置多種ViewModel該如何處理呢,這時候可以在ViewModelManager注冊時添加Token屬性,然后用SetViewModel(this,token)的方式指定特定的ViewModel為DataContext。

      另一個是消息注冊的范圍。因?yàn)橐话銇碚fViewModel都是和綁定的View通信。所以默認(rèn)情況下,消息注冊到單獨(dú)一個MessageManager中,這個MessageManager保存ViewModel中,ViewModel使用這個MessageManager發(fā)送消息,發(fā)送的消息由View接收。但如果需要和其他View通信,需要把消息注冊到MessageManager.Default中,這個對象是static的,要達(dá)到這個目的只要在View設(shè)置ViewMode時這樣來SetViewModel(this,isGlobalMsg:true)即可。如果ViewModel又想和綁定的View單獨(dú)通信,有時候還需要和別的View通信,可以在消息注冊器中注冊時將需要單獨(dú)通信的消息設(shè)置一個Group,ViewModel在發(fā)送消息時加一個Group過濾一下即可。一個Group可以理解為消息的單獨(dú)一個通道。

      順帶一提,好吧只是順帶一提的是,在給View注入ViewModel時,順便把ViewModel的UIDispatcher屬性設(shè)置為了View的Dispatcher,雖然我不知道這有什么用。但這樣在ViewModel中使用UIDispatcher時即為相關(guān)的View的Dispatcher。如果要使用MainWindow的Dispatcher可以通過DispatcherHelper.Dispatcher或者App.Current.MainWindow.Dispatcher獲得。

      0x02 寫在最后

      到此為止我能想到的MVVM框架的功能算是基本實(shí)現(xiàn)了,遇到的需求十分有限,才能也十分有限,能想到的就這幾個了,歡迎回復(fù)討論,也歡迎加我QQ16141860交流。之前一直是在TestArea這個倉庫里進(jìn)行測試,現(xiàn)在這個小框架整理了下,放到AyxMVVM倉庫里了。現(xiàn)在有些想法還不太成熟,使用過程中遇到問題也會隨時修正,以后就都修改到AyxMVVM中了,TestArea中的MyMVVM不再維護(hù)了。另外給倉庫起名真是件麻煩事,干脆統(tǒng)一都用Ayx+XXX的方式,這樣既容易重復(fù)的概率又十分小。Ayx是我名字拼音的首字母,想想看以拼音A開頭的姓氏之少就能想到幾乎不會出現(xiàn)重復(fù)了。最后,10月6日看了微軟的秋季產(chǎn)品發(fā)布會后信仰充值成功。對UWP十分感興趣,下一步打算學(xué)習(xí)一下。

      0x03 關(guān)于AyxMVVM

      https://github.com/durow/AyxMVVM

       


      更多內(nèi)容歡迎訪問我的博客:http://www.durow.vip

      posted @ 2015-10-11 22:21  durow  閱讀(16227)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 国产精品乱码高清在线观看| 国产精品午夜无码AV天美传媒 | 亚洲码和欧洲码一二三四| 香港日本三级亚洲三级| 欧美一区内射最近更新| 日本边添边摸边做边爱| 东京热大乱系列无码| 国产99久久无码精品| 黎川县| 99re6这里有精品热视频| 成人亚洲精品一区二区三区| 一亚洲一区二区中文字幕| 亚洲综合精品一区二区三区| 高清国产一区二区无遮挡| 亚洲天堂av 在线| 国产精品午夜福利精品| jizz国产免费观看| 好紧好湿好黄的视频| 日韩精品亚洲专在线电影| 青青青青久久精品国产| 人人妻人人狠人人爽天天综合网| 欧美丰满熟妇xxxx性大屁股| 亚洲av熟女国产一二三| 成人拍拍拍无遮挡免费视频| 丰满岳乱妇一区二区三区| 国产av丝袜熟女一二三| 日本视频一区二区三区1| 亚洲精品国产av成拍色拍个| 欧美videos粗暴| 少妇精品视频一码二码三| 亚洲日韩AV秘 无码一区二区| 亚洲av无码片在线播放| 91精品久久一区二区三区| 欧美 亚洲 日韩 在线综合| 青青草无码免费一二三区| 国产一级特黄高清大片一| 日韩人妻少妇一区二区三区| 国产精品成人av电影不卡| 国产偷国产偷亚洲高清午夜| 亚洲精品自拍在线视频| 国产成人亚洲精品狼色在线|