在mvvmcross v3中,我使用ShowViewModel导航到不同的页面。在转换到mvx之前,我将使用NavigationService.GoBack()方法返回上一页。优点是页面没有被重新创建。
由于GoBack方法是wp、winrt、silverlight特定于平台的,那么处理返回上一页以便视图模型保持独立于平台的最佳方法是什么?
一种解决方案可能是使用ShowViewModel传递视图所能看到的一些数据,然后在WP/WRET的情况下,从视图中调用RemoveBackEntry。但有了MVX,也许还有更好的方法。

最佳答案

在mvvmcross v3中,我们提供了一种特定的机制,允许viewmodels向ui发送他们想要更改当前表示的消息。
这个机制是ChangePresentation(MvxPresentationHint hint)并提供从ViewModelsPresenter的消息路由-表示提示。
Presenter如何处理这些消息是特定于平台和应用程序的。
此消息机制非常通用,将来可能会用于所有类型的事情,例如,开发人员可能会提供一些提示,用于执行更改UI布局、突出显示部分UI、强制用户将注意力集中到某个控件等操作,导致SIP被显示或隐藏等。
对于关闭视图模型的情况,我们提供了MvxPresentationHint-MvxClosePresentationHint-的专门化和MvxViewModel基类中的helper方法:

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

要使用这个视图模型可以调用Close(this)
当调用此函数时,用户界面中的演示者将收到一条关于ChangePresentation方法的消息:
public interface IMvxViewPresenter
{
    void Show(MvxViewModelRequest request);
    void ChangePresentation(MvxPresentationHint hint);
}

对于一般/典型情况-当关闭的ViewModel附加到最上面的视图时,mvvmcross中的默认演示者将能够处理此消息,并且能够在windows中Activity,在android中Page,在ios中UIViewController
但是,如果你的用户界面比这个复杂-例如,如果你想要的GoBack实际上对应于一个Finish,一个PopViewController,一个ViewModel窗格,等等,或者如果Close对应的不是层次结构中当前最顶层的视图,那么您将需要提供一个自定义的Presenter实现,并且该实现必须执行特定于平台和应用程序的逻辑来处理Tab
以上提示是我推荐你使用的…
但是,作为一种选择:
如果你觉得这个Flyout机制对于你的应用程序来说太重量级/过多,那么你当然也可以下拉到自定义或基于CC的机制。
这样做的一个示例是customermanagement示例-它在每个平台上提供了一个自定义的iviewmodelclower实现-请参见:
自定义接口-https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement/Interfaces/IViewModelCloser.cs
基本视图模型-https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement/ViewModels/BaseViewModel.cs
机器人-AA>
WP-https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement.Droid/SimpleDroidViewModelCloser.cs
触摸-https://github.com/slodge/MvvmCross/blob/v3/Sample%20-%20CustomerManagement/CustomerManagement/CustomerManagement.WindowsPhone/ViewModelCloser.cs

关于c# - 在不同的MvvmCross(v3)平台上处理GoBack的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16157597/

10-10 18:30