一步一步分析Caliburn.Micro(一:綁定執行方法Message)


 分析擴展類Message.Attach前我們現以標准MVVM的形式看下,通過比較才會知道CM帶來的方便.下面用的例子都為CM源碼中找出來的代碼段.

  1. cal:Message.Attach="DeactivateItem($dataContext, 'true')"
  2. cal:Message.Attach="[Key Enter] = [EnterPressed]"
  3. cal:Message.Attach="[Event MouseDoubleClick] = [Action ShowView]; [Event Click] = [Action ShowView]"

 

按順序對應的1-3個

功能大致實現2\3功能由於沒有參數傳入.功能都完全成功以MVVM寫回出來.

功能1的參數有兩個CallMethodAction這個類只能傳入一個參數,如果不自己寫方法擴展的話功能1最多就只能寫到DeactivateItem($dataContext)這樣子而以,想要有更多的參數就不行了.如果想要當前事件的EvnetArge作為參數與是很麻煩的.

CM可以用一行代碼等於傳統的幾行代碼.存在多個這樣子的功能時,代碼效率高看起來也直觀.俗話說的好不怕不識貨就怕貨比貨.現在就讓我們直接分析這簡單的一行代碼是怎么把標准MVVM這多行代碼功能集成.

從CM的實例代碼中.從Message.Attach這個擴展方法作為分析的切入點.Message類上注冊AttachProperty (public)\HandlerProperty (private)\ MessageTriggersProperty (internal)這幾個擴展方法的注冊信息.從分析\排查\訪問形式等方式當前是直接鎖定AttachProperty. 

從代碼中看以Get\Set沒有什么特別.都是標准的取值付值.看到注冊擴展信息的信息上在屬性改變時執行了OnAttachChanged方法.讓我們看看這個方法又包含了什么. 

通過OnAttachChanged方法知道,紅是區域就是給控件的觸發器集合做綁定,其它只是清理和添加集合.到分析下紅色區域的代碼讓我們更加接近真相吧. 

Parser類中的Parse方法讓我知道解釋命令字符串的規則也讓我們粗略知道通過解釋命令字符串創建對應的觸發事件與對應的綁定函數方法.這樣大致原理都已經出來了.那又是什么具體的創建觸發器的呢,那細節上還有什么我們不為人知的關鍵點呢.你可要記得triggerPlusMessage數組是中第一個元素可是有為空情況的. 

不為空的情況好處理嘛.但為空時怎么能確定默認要綁定的事件呢,看ConventionManager.GetElementConvention這個地方有貓膩.等等好像還有個問題,在CM樣例程序中不是有個叫[Key Enter] = [EnterPressed]的代碼行的嘛.從這看不是沒有對Key的處理嘛.先不用急你可以看下CreateTrigger可是個委托還是個公開可修改的.下次讓我們了解CM是怎么進行Evnet之外的處理.現在還是把正常流程分析完成. 

我的天啊ActionMessage是什么東東,接口IHaveParameters又是什么東東啊?不是這樣子玩我吧,看來這分解還沒成功不過還好是把基本思路走通了. SplitParameters這個方法就不細說了簡單一名就是把參數字符串解釋成對應的數組.不過有點不太明白框架這可是自帶侵害功能的為什么還要自己寫一個呢.不知道你還刻上面也有個Split方法.這就更是可以用框架自帶的方法了.這也是我比較不明白地方之一.難度自己寫的比框架自帶的性能要高??這點我就沒有去驗證了好像有點走題了.這些小問題還是別理先而ActionMessage這類說明來也比較復雜還是等下次再細說吧還是跳到重點怎么綁定對應的參數.

 

創建Binding中由於環境不同出現了#if的環境,我把非WPF的情況都收起來只看WPF下的代碼情況.我的天天怎么還有BindingScope, ConventionManager,View.看來CM為了這個看起來簡單的功能還做了不少的功夫啊.還好功能都基本分析出來了.

下次自己寫控件時用命令字符串綁定時我可知道怎么去寫了,你理解沒有???那些用到沒有細講的類還知道是什么吧???已經細講的類你有沒有發現這個功能都分析完了但是還有沒用到的呢???還是列出清單那可是有46文件的.

已經用到類

是否分析

是否完全分析

備注

Message

 

 

Parser

 

ConventionManager

 

 

 

ActionMessage

 

 

 

IHaveParameters

 

 

 

Parameter

 

 

 

MessageBinder

 

 

 

View

 

 

 

BindingScope

 

 

 

ExtensionMethods

 

 

簡單的方法擴展不細講

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM