簡體   English   中英

如何使用MVVMCross構造視圖模型

[英]How to structure viewmodels with MVVMCross

我正在邁出MvvmCross框架的第一步,我正在嘗試在項目和類結構方面決定最佳方法。 我現在最關心的是決定如何組織我的視圖模型以便在它們之間共享數據,同時遵循mvvm指南。

我有一個關於視圖和相應視圖模型(主要和配置)的簡單示例。 主視圖具有綁定到viewmodel中的屬性的一些控件。 配置視圖使用戶能夠更改文本顏色,列表中的項目數等...當用戶更改配置時,這應該反映在主視圖中。

我的第一種方法是創建單獨的視圖和視圖模型。 但是,如何通知主視圖配置已更改? 我在Github / Slodge下看到了Sphero項目,我意識到視圖模型可以直接引用其他視圖。 通過這種方式,每次配置更改時都很容易通知主視圖。 但這不是mvvm推薦的解耦視圖模型的偏差嗎?

我能否獲得一些有關處理此類類結構的最佳方法的見解?

接近這種類結構的最佳方法

在我看來,“最好的方式”最重要的衡量標准是選擇一種意味着你的應用程序有效的方式。


你看過的例子 - sphero ball control - 有獨立視圖模型(home,gangnam,about,sphero等)的例子,它有一些相互了解的視圖模型的例子 - sphero視圖模型它是子視圖模型。

在這種特殊情況下,這些視圖模型彼此了解的原因是因為它們都是單個顯示的一部分 - 它們被設計為在單個網格,數據透視或選項卡式UI中放置在一起。 為了幫助他們合作我通過IParent和IChild接口給了他們彼此的引用。

這不是mvvm推薦的解耦視圖模型的偏差嗎?

我承認這確實意味着設計沒有完全解耦,如果我將來需要移動或重用那些子vm,那么我可能需要做一些代碼重構 - 但是現在設計對我來說很有效如果我需要的話,我個人很高興在將來進行重構。


我現在最關心的是決定如何組織我的視圖模型以便在它們之間共享數據,同時遵循mvvm指導

如果您正在構建復合(選項卡式)視圖,並且您不滿意使用聚合視圖模型(如sphero vm及其子視圖),那么請不要。

我確信在使用一個大視圖模型的sphero中可以實現相同的效果,使用通過信使進行通信的多個視圖模型或使用通過一個或多個自定義服務進行通信的多個視圖模型。

對於您給出的特定示例 - 配置和主視圖,我認為這不符合選項卡式方案 - 我可能會使用信使編碼 - 這將為我提供一種靈活的機制來廣播和接收更改通知應用程序的各個部分。

但是,其他設計絕對可用且可行 - 例如,您可以輕松地要求視圖模型在每次顯示時刷新其配置(這樣做需要掛鈎到onnavigatedto,viewwillapear和視圖中的resume調用)。


綜上所述:

  • 我同意你編寫獨立視圖模型並使它們通過服務進行通信的總體目標。
  • 在主頁面和設置頁面的情況下,我可能會使用2個單獨的vm和一個信使
  • 在標簽/樞軸UI的情況下,我個人已經脫離了那個完美的范例 - 但mvx中沒有任何東西迫使你跟着我

在我使用MvvmCross構建的項目中,我決定使用viewmodels來表示視圖(屏幕)及其狀態。 我的viewmodels使用ISQLiteConnectionFactory連接到SQLite數據庫。 我使用存儲在SQLite數據庫中的模型來表示項目中的事物狀態。 我的視圖模型從SQLite數據庫中獲取模型,分析它們並做出反應。

例。 我有一個屏幕,用戶可以標記他/她想要在設備上下載一些數據。 我的模型有一個標志,表明該數據是應該下載還是已下載。 當我打開另一個負責下載數據的屏幕時,它會查看SQLite,因為任何模型都標記為下載並對其作出反應。

這就是我決定在viewmodels之間共享數據的方式。 優點是數據始終保存在數據庫中,強制關閉應用程序不會導致數據丟失(或者沒有按預期發生的事情)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM