在 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
// , Page
MvvmCrossUIViewController
中的默认演示者将能够处理此消息,并且能够GoBack
在 Windows、Finish
Android 和在PopViewController
iOS 中。
但是,如果您的 UI 比这更复杂 - 例如,如果ViewModel
您想要Close
实际对应于 a Tab
、 a Flyout
、SplitView
窗格等,或者如果ViewModel
对应于层次结构中当前最顶层视图以外的其他内容 - 那么您将需要提供一个自定义的 Presenter 实现——并且该实现必须做平台和应用程序特定的逻辑来处理Close
.
以上提示是我建议您使用的...
但是,作为替代方案:
如果您觉得这种ChangePresentation(MvxPresentationHint hint)
机制对您的应用程序来说太重/过大了,那么您当然也可以改为使用自定义或Message
基于机制的机制。
执行此操作的一个示例是 CustomerManagement 示例 - 它在每个平台上提供了一个自定义 IViewModelCloser 实现 - 请参阅: