2013-04-22 61 views
11

在MvvmCross v3中,我使用ShowViewModel導航到不同的頁面。在轉換爲Mvx之前,我會使用NavigationService.GoBack()方法返回上一頁。好處是頁面不會被重新創建。什麼是處理不同MvvmCross(v3)平臺的GoBack的最佳方式

由於GoBack方法是針對WP,WInRT和Silverlight的特定平臺,處理返回到上一頁的最佳方式是什麼,以便視圖模型保持平臺獨立?

一種解決方案可能是使用ShowViewModel傳遞視圖可以看到的一些數據,然後在WP/WinRT的情況下從視圖調用RemoveBackEntry。但對於Mvx,可能有更好的方法。

回答

18

在MvvmCross v3中,我們提供了一種特定的機制,允許ViewModel向用戶界面發送消息,以便他們更改當前的演示文稿。

該機制是ChangePresentation(MvxPresentationHint hint),它提供消息路由 - 顯示提示 - 從ViewModelsPresenter

Presenter如何處理這些消息是平臺和應用程序特定的。

此消息機制非常普遍,可用於將來的各種事情 - 例如,開發人員可能會提供一些提示,比如更改用戶界面佈局,這會突出顯示用戶界面的一部分,這會強制用戶將注意力集中到特定的控件上,從而導致顯示或隱藏SIP等。


爲了關閉一個視圖模型的情況下,我們提供的MvxPresentationHint一個專業化 - MvxClosePresentationHint - 在基類的MvxViewModel和一個輔助方法:

protected bool Close(IMvxViewModel viewModel) 
    { 
     return ChangePresentation(new MvxClosePresentationHint(viewModel)); 
    } 

要使用該一個ViewModel可以只是叫Close(this)

當這個被調用時,演示圖形界面中會收到關於ChangePresentation方法的消息:

public interface IMvxViewPresenter 
{ 
    void Show(MvxViewModelRequest request); 
    void ChangePresentation(MvxPresentationHint hint); 
} 

對於一般/典型的情況下 - 其中正被關閉的ViewModel附接到哪個是最頂層Activity/Page/UIViewController視圖,內MvvmCross默認主持人將能夠處理該消息,將能夠在Windows中爲GoBack,在Android中爲Finish,在iOS中爲PopViewController。但是,如果你的用戶界面比這更復雜 - 比如說,如果您想要的ViewModel實際上對應於TabFlyoutSplitView窗格等,或者如果ViewModel對應於層次結構中當前最頂層視圖之外的其他內容 - 則您需要提供自定義演示者實現 - 並且該實現必須執行平臺和應用程序特定邏輯來處理Close


上面提示是什麼,我建議你使用...

然而,作爲替代

如果你覺得這ChangePresentation(MvxPresentationHint hint)機制實在是太重量級/矯枉過正您的應用程序,那麼您當然也可以下載到自定義或基於Message的機制。這是否

一個樣品是CustomerManagement樣本 - 它提供了每個平臺上的自定義IViewModelCloser實現 - 見:

+0

我看到並且像你說過的,可以從平臺主持人繼承,覆蓋ChangePresenter並告訴Mvx使用新的演示者。 – 2013-04-23 04:29:44

3

我不完全確定mvvmcross,但在MVVM Light中,通常做的是創建一個公開這些方法的INavigationService接口。然後,每個平臺以特定於平臺的方式(例如通過獲取對當前幀及其內容的引用)實現該接口。然後,該特定於平臺的實例可以執行所有正確的操作,以確保導航模式的正確實施。

您的ViewModels然後可以通過依賴容器獲取對INavigationService實例的引用。這樣你的虛擬機就可以獨立於導航的平臺細節。

我也寫過關於如何使用接口,露出一個共同的API平臺的特定功能的博客文章:http://www.kenneth-truyers.net/2013/02/24/patterns-for-sharing-code-in-windows-phone-and-windows-8-applications/

在博客文章的例子是關於獨立存儲,但同樣的原則也適用於導航(或任何在各種平臺上具有不同實現的功能)

+2

好點,但與Mvx所有平臺的所有視圖模型生活在一個可移植的類庫。所以導航是用MvxNavigatingObject中的ShowViewModel抽象出來的。如果出於某種原因,所有平臺都不支持GoBack之類的東西,我認爲它不在Mvx的核心中。 – 2013-04-22 23:05:39

+0

好吧,我不知道。就像我說的,我沒有使用MVVMcross,所以也許我的觀點在你的情況下是無效的。但是,它會是繼承mvxNavigationObject並添加該方法(當然是抽象的)的解決方案嗎?這是一個瘋狂的猜測,也許它根本沒有意義。 – Kenneth 2013-04-22 23:07:51

+0

已經添加了答案 - @ Kenneth的一般觀點是現貨(所以我+ 1ed)。我的答案是提供關於我們如何使用'ChangePresentation' API在MvvmCross中提供抽象的細節。除了提供這個API,我們也提供針對FileStorage之類的插件:) – Stuart 2013-04-23 00:33:43

相關問題