在MvvmCross v3中,我使用ShowViewModel
导航到不同的页面。在转换为Mvx之前,我使用NavigationService.GoBack()
方法返回上一页。优点是不会重新创建页面。
由于GoBack
方法是特定于WP,WInRT,Silverlight的平台,处理返回上一页的最佳方法是什么,因此视图模型保持独立于平台?
一种解决方案可能是使用ShowViewModel
传递视图可以看到的一些数据,然后在WP / WinRT的情况下,从视图中调用RemoveBackEntry
。但是对于Mvx,可能有更好的方法。
答案 0 :(得分:18)
在MvvmCross v3中,我们提供了一种特定的机制,允许ViewModels向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)
调用此方法时,您的用户界面中的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
实际上与Tab
,Flyout
,SplitView
窗格等对应,或者{{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/
博客文章中的示例是关于隔离存储,但相同的原则适用于导航(或任何在各种平台上具有不同实现的功能)