获取当前的ViewModel MvvmCross

奇怪的是,我没有找到对互联网上这个非常简单的问题的直接回答。

如何在MvvmCross运行时中确定当前活动的ViewModel

可能吗? 如果没有,为什么我不应该这样做?

正如我最近了解到的那样,ViewModel“活跃”在很大程度上取决于您使用的Presenter。 如果您只使用默认的演示者,这似乎很容易,因为在任何给定时间只显示一个ViewModel。 但是,使用更高级的演示者,您可以拥有多个活动的ViewModel。

由于当前活动的ViewModel取决于您使用的Presenter(它位于视图层中),因此Mvx核心无法知道如何访问它/它们。 如果这是您认为需要的,我建议您使用自己的界面实现自己的Presenter。

这是iOS的一个例子:

ICurrentViewModelPresenter.cs

 public interface ICurrentViewModelPresenter { IMvxViewModel CurrentViewModel { get; } } 

CurrentViewModelPresenter.cs:

 public class CurrentViewModelPresenter : MvxTouchViewPresenter, ICurrentViewModelPresenter { public CurrentViewModelPresenter(UIApplicationDelegate del, UIWindow win) : base(del, win) { } public IMvxViewModel CurrentViewModel { get { var viewController = MasterNavigationController.TopViewController; if (viewController == null) return null; var touchView = viewController as IMvxTouchView; if (touchView == null) return null; return touchView.ReflectionGetViewModel(); } } } 

Setup.cs:

 public class Setup : MvxTouchSetup { private readonly MvxApplicationDelegate _del; private readonly UIWindow _win; public Setup(MvxApplicationDelegate del, UIWindow win) : base(del, win) { _del = del; _win = win; } ... protected override IMvxTouchViewPresenter CreatePresenter() { var presenter = new CurrentViewModelPresenter(_del, _win); Mvx.RegisterSingleton(presenter); return presenter; } } 

代码中的任何位置:

 var presenter = Mvx.Resolve(); // or inject with IoC var current = presenter.CurrentViewModel; 

请注意,这些都没有经过测试,但它应该让您了解它是如何工作的。