处理不同MvvmCross(v3)平台的GoBack的最佳方法是什么

在MvvmCross v3中,我使用ShowViewModel导航到不同的页面。 在转换为Mvx之前,我使用NavigationService.GoBack()方法返回上一页。 优点是不重新创建页面。

由于GoBack方法是特定于WP,WInRT,Silverlight的平台,处理返回上一页的最佳方法是什么,因此视图模型保持独立于平台?

一种解决方案可能是使用ShowViewModel传递视图可以看到的一些数据,然后在WP / WinRT的情况下,从视图中调用RemoveBackEntry 。 但是对于Mvx,可能有更好的方法。

在MvvmCross v3中,我们提供了一种特定的机制,允许ViewModels向UI发送消息,以便他们更改当前的演示文稿。

这个机制是ChangePresentation(MvxPresentationHint hint) ,它提供了从ViewModelsPresenter的消息路由 – 表示提示。

Presenter如何处理这些消息是特定于平台和应用程序的。

这种消息机制非常通用,它可能会在未来用于所有类型的事情 – 例如,开发人员可能会提供一些提示,例如更改UI布局,这会强调UI的一部分,这会强制用户专注于某个控制,导致SIP显示或隐藏等。


对于关闭视图模型的情况,我们提供了MvxPresentationHintMvxClosePresentationHint – 以及MvxClosePresentationHint基类中的辅助方法:

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

要使用它,ViewModel可以只调用Close(this)

调用此方法时,UI中的Presenter将收到有关ChangePresentation方法的消息:

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

对于一般/典型情况 – 正在关闭的ViewModel附加到最顶层的Activity / Page / UIViewController视图,MvvmCross中的默认演示者将能够处理此消息并且能够在Windows中进行GoBack ,在Android中Finish ,在iOS中使用PopViewController

但是,如果您的UI比这更复杂 – 例如,如果要CloseViewModel实际上对应于TabFlyoutSplitView窗格等,或者ViewModel对应于除当前最顶层视图之外的其他内容层次结构 – 然后您将需要提供自定义的演示者实现 – 并且该实现将必须执行平台和特定于应用程序的逻辑来处理Close


以上提示是我建议您使用的…

但是,作为替代方案

如果您觉得这个ChangePresentation(MvxPresentationHint hint)机制对您的应用程序来说太过重量级/过度ChangePresentation(MvxPresentationHint hint) ,那么您当然也可以下载到自定义或基于Message的机制。

执行此操作的一个示例是CustomerManagement示例 – 它在每个平台上提供自定义IViewModelCloser实现 – 请参阅:

我不完全确定mvvmcross,但在MVVM Light中,通常做的是创建一个暴露这些方法的INavigationService接口。

然后,每个平台以特定于平台的方式实现此接口(例如,通过获取对当前帧及其内容的引用,在WP中)。 然后,此平台特定实例可以执行所有正确的操作,以确保正确实现导航模式。

然后,您的ViewModel可以通过依赖关系容器获取对INavigationService实例的引用。 这样,您的VM就独立于导航的平台细节。

我还写了一篇关于如何使用Interfaces公开用于平台特定function的通用API的博客文章: http : //www.kenneth-truyers.net/2013/02/24/patterns-for-sharing-code-in-windows -phone-和-窗口8的应用程序/

博客文章中的示例是关于隔离存储,但相同的原则适用于导航(或任何在各种平台上具有不同实现的function)