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

Der*_*tie 12 c# mvvmcross

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

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

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

Stu*_*art 18

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

这种机制ChangePresentation(MvxPresentationHint hint),它提供消息路由-呈现提示-从ViewModelsPresenter.

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

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


对于关闭视图模型的情况,我们在以下基类中提供了MvxPresentationHint- MvxClosePresentationHint- 和辅助方法的特化MvxViewModel:

    protected bool Close(IMvxViewModel viewModel)
    {
        return ChangePresentation(new MvxClosePresentationHint(viewModel));
    }
Run Code Online (Sandbox Code Playgroud)

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

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

public interface IMvxViewPresenter
{
    void Show(MvxViewModelRequest request);
    void ChangePresentation(MvxPresentationHint hint);
}
Run Code Online (Sandbox Code Playgroud)

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

但是,如果您的UI比这更复杂 - 例如,如果ViewModel您想要Close实际对应于a Tab,a Flyout,to a SplitViewpane等,或者如果ViewModel对应于层次结构中当前最顶层视图以外的其他内容 - 那么您将需要提供自定义的演示者实现 - 并且该实现必须执行平台和特定于应用程序的逻辑来处理Close.


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

但是,作为替代方案:

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

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