MVVM模式--游戲地圖編輯器開發隨筆(1)

這個文章打算長久的寫下去,一方面是記錄自己學習到的知識,以便遺忘,另一方面是希望在撰寫文章的過程中提升自己的文字能力并且鞏固知識。

首先是MVVM模式本身。跟WPF本身的模式不同,WPF本身的概念是UI和后臺邏輯的分開,使整個工作流程解耦,設計人員和程序編寫的人可以比較方便的協作,比較適合小型的程序。MVVM模式便是為了更加大型的程序的一種模式,也被當做插件編寫在VS的插件庫中,是一種輕量級,十分方便的模式。
MVVM的思想本質上與WPF的思想相同——UI與后臺邏輯的解耦。但是MVVM進一步拉開了兩者,從兩個綁定的xaml文件與cs文件分開了來,其中xaml負責UI的構造,cs文件負責后臺邏輯(原本的cs文件還存在也可以使用,但是被歸為UI實現的一類了)。前端UI被稱為View,即用戶看到的部分(可以是UserControl,Page,Window等等),邏輯稱為ViewModel負責與其綁定的View的后臺邏輯,Model則是數據。在WPF本來的模式中Model和ViewModel是沒有分開的,統一的寫在xaml文件的后臺代碼之中,而在MVVM模式之中所有邏輯都放在ViewModel里面,并且與UI呈綁定關系,UI不能直接修改數據(Model)本身,需要通過ViewModel的邏輯來修改。
安裝MVVM之后,創建ViewModel需要繼承ViewModelBase,Model需要繼承ObsevableObject。

=====================================================================

用WPF開發程序的時候,一般不可避免的會用到UserControl,但是在一些中型或者大型的項目之中,UserControl一般放到主項目外的另一個項目之中,用引用來在主項目的窗體中添加內容,使用MVVM時需要注意UserControl的黑盒性。
也就是說UserControl對于主窗體本身來說是個完全封閉的對象,其邏輯完全依賴于自身內部的實現,主窗體調用的時候只需要添加相應的標簽,需要的時候把UserControl暴露出來的依賴屬性(DP)進行綁定。由于是使用MVVM模式,所以UserControl內部也要進行View和ViewModel的劃分,但是UserControl本身沒有Model,Model的獲取(從數據庫)是由主窗體來完成的,而且若是有多個UserControl來編寫Model的話,集成度(感覺)會很低,沒有由主窗體來獲取Model方便。那么UserControl的Model從主窗體來,那么如何引用到UserControl之中呢?——依賴屬性與綁定。由于UserControl內部也是MVVM模式,所以View(xaml)對應了一個ViewModel(獨立的cs文件),其中View顯示的內容與ViewModel綁定,ViewModel在理論上應該直接與Model綁定,但是Model在主窗體之中,就需要把屬性暴露出去給主窗體綁定,然而能夠暴露的屬性是依賴屬性,并且需要在后臺代碼(綁定的cs文件)中定義,所以在后臺代碼中定義了依賴屬性以后,需要把這個依賴屬性與ViewModel連接起來,這個時候起到作用的便是Messenger。Messenger有Send和Register兩種方法,其中Register:

Messenger.Default.Register<Type>(this, token, (parameter) =>{
        //...Do sth.
});

this是傳到MVVM內部,代表這個對象接受這個消息,token是消息的標識,parameter是傳過來的參數,只能傳一個,根據情況可能需要整合。Send本身用法也差不多,Messenger感覺十分重要,需要熟練掌握,詳細看Messenger--UncleNull

這樣只需要在后臺代碼和ViewModel中各添加一個Register與Send便能保持綁定關系。這樣以來在使用的時候只需要與主窗體的相關ViewModel內容綁定,便能實現目的。

構造圖:
image.png

歡迎指正。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容