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

时间:2013-04-22 22:09:12

标签: c# mvvmcross

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

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

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

2 个答案:

答案 0 :(得分:18)

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

此机制为ChangePresentation(MvxPresentationHint hint),它提供了从ViewModelsPresenter的消息路由 - 演示提示。

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

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


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

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

要使用此功能,ViewModel只需拨打Close(this)

即可

调用此方法时,您的用户界面中的Presenter会收到ChangePresentation方法的消息:

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

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

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


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

但是,作为替代

如果你觉得这个Close机制对你的应用来说太过重量级/过度杀伤,那么你当然也可以选择下拉到自定义或基于ChangePresentation(MvxPresentationHint hint)的机制。

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

答案 1 :(得分:3)

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

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

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

我还撰写了一篇博客文章,介绍如何使用Interfaces公开针对平台特定功能的通用API:http://www.kenneth-truyers.net/2013/02/24/patterns-for-sharing-code-in-windows-phone-and-windows-8-applications/

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