在 MvvmCross v3 中,我们提供了一种特定的机制来允许 ViewModel 向 UI 发送他们想要更改当前呈现的消息。
这种机制是ChangePresentation(MvxPresentationHint hint)并且它提供了从ViewModels到Presenter.
Presenter处理这些消息的方式取决于平台和应用程序。
这种消息机制非常通用,将来可能会用于各种事情 - 例如,开发人员可能会提供一些提示,例如更改 UI 布局,突出显示部分 UI,迫使用户专注于某个控制,导致 SIP 显示或隐藏等。
对于关闭视图模型的情况,我们提供了一个特殊化的MvxPresentationHint- MvxClosePresentationHint- 和一个基类中的辅助方法MvxViewModel:
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// , PageMvvmCrossUIViewController中的默认演示者将能够处理此消息,并且能够GoBack在 Windows、FinishAndroid 和在PopViewControlleriOS 中。
但是,如果您的 UI 比这更复杂 - 例如,如果ViewModel您想要Close实际对应于 a Tab、 a Flyout、SplitView窗格等,或者如果ViewModel对应于层次结构中当前最顶层视图以外的其他内容 - 那么您将需要提供一个自定义的 Presenter 实现——并且该实现必须做平台和应用程序特定的逻辑来处理Close.
以上提示是我建议您使用的...
但是,作为替代方案:
如果您觉得这种ChangePresentation(MvxPresentationHint hint)机制对您的应用程序来说太重/过大了,那么您当然也可以改为使用自定义或Message基于机制的机制。
执行此操作的一个示例是 CustomerManagement 示例 - 它在每个平台上提供了一个自定义 IViewModelCloser 实现 - 请参阅: