<a></a>
<b>閱讀目錄</b>
<a href="http://www.cnblogs.com/OceanEyes/p/unity3d_framework_designing_get_started_with_mvvm_part2.html#_label0">MVVM回顧</a>
<a href="http://www.cnblogs.com/OceanEyes/p/unity3d_framework_designing_get_started_with_mvvm_part2.html#_label1">進一步抽象</a>
<a href="http://www.cnblogs.com/OceanEyes/p/unity3d_framework_designing_get_started_with_mvvm_part2.html#_label2">重構視圖基類:UnityGuiView</a>
<a href="http://www.cnblogs.com/OceanEyes/p/unity3d_framework_designing_get_started_with_mvvm_part2.html#_label3">小節</a>
經過上一篇文章的介紹,相信你對MVVM的設計思想有所了解。MVVM的核心思想就是解耦,View與ViewModel應該感受不到彼此的存在。 View隻關心怎樣渲染,而ViewModel隻關心怎麼處理邏輯,整個架構由資料進行驅動。不僅View與ViewModel彼此解耦,ViewModel與ViewModel之間也是解耦的。 通過消息訂閱-釋出機制,解決了ViewModel之間的強依賴關系。
先回顧一下我們已完成的功能,Framework中最核心就是BindableProperty 類,ViewModel 中所有需要被綁定到UI 控件的屬性必須是一個BindableProperty 對象。它是一個職責非常單一的類,監聽Value的數值是否發生變化,當變化時,觸發OnValueChanged 事件,通知View 做出相應的更新。
那問題來了,View在何時并以怎樣的方式去監聽這些屬性的變化呢?
BindableProperty是一個很好的設計,它不僅可以用在ViewModel中,還可以用在View中,用它來修飾 ViewModel,當ViewModel 改變時,比如初始化時,或者從一個ViewModel變化到另一個ViewModel對象時,在觸發的OnBindingContextChanged 事件中實作對ViewModel中的屬性監聽。如下定義的抽象父類:UnityGuiView
子類SetupView繼承自UnityGuiView,并且Override OnBindingContextChanged,并實作對ViewModel中的屬性監聽。
實際上對于ViewModel而言會有非常多的BindableProperty需要被綁定到UI控件中,從代碼的可讀性而言,如下代碼是非常沉長和啰嗦的:
因為+=和-=是成對出現的,是以隻要是看到 OnValueChanged,這部份代碼的長度幾乎都是*2。
仔細觀察一下,每個View都會出現 具體的 ViewModel.屬性.OnValueChanged事件+=或者-=具體的處理函數 這樣的固定模闆。
那麼是否可以将這部分代碼抽象到一個公共類中呢,并且暴露出一個簡單的方法提供給View來初始化這些OnValueChanged事件,比如:
然後在Init方法中+=或者-=具體的處理函數。
當然是可以得,定義一個PropertyBinder屬性綁定器,通過反射技術,動态為屬性+=或者-= OnValueChanged 事件,腦海裡的 Raw 代碼如下
最核心的代碼就那麼幾步,詳細代碼可以檢視源代碼PropertyBinder的實作。
想象一下PropertyBinder應該放在哪兒。
它是用來監聽ViewModel中的屬性值變化的,用來替換沉長的 oldVm.Property.OnValueChanged +=和-= NameValueChanged,理所應當應該放在View中,因為每個View都需要,故将它定義在UnityGuiView 中。
又因為PropertyBinder需要知道為哪個ViewModel進行服務(因為需要反射),故通過泛型來限制 UnityGuiView< T >:IView where T:ViewModelBase 。
再對BindingContext稍作改變,當它被指派時,隻初始化一次對OnValueChanged事件的監聽(原先是放在構造函數裡)。
值得注意的事,我定義了一個virtual的OnInitialize,這樣子類可以override它進而實作一些初始化方法,比如:
這篇部落格基本上是回顧了MVVM模式在Unity 3D上的實踐,結合自己的開發經驗,通過反射的技術可以有效減少沉長的代碼。

本文轉自木宛城主部落格園部落格,原文連結:http://www.cnblogs.com/OceanEyes/p/unity3d_framework_designing_get_started_with_mvvm_part2.html,如需轉載請自行聯系原作者