获取当前的ViewModel MvvmCross [英] Get current ViewModel MvvmCross

查看:160
本文介绍了获取当前的ViewModel MvvmCross的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Strangely, I did not find a direct answer to the very simple question on the internet.

如何确定MvvmCross运行时中当前处于活动状态的ViewModel?

How do I determine currently active ViewModel in MvvmCross runtime?

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

Is it possible? If not, why am I not supposed to do it?

推荐答案

据我最近了解,哪个ViewModel是活动的",很大程度上取决于您使用的Presenter.如果仅使用默认演示者,这似乎很容易,因为在任何给定时间仅显示一个ViewModel.但是,使用更高级的演示者,您可以具有多个活动的ViewModel.

As I learned recently, which ViewModel is "active" depends heavily on which Presenter you use. If you just use the default presenters, it seems easy because only one ViewModel is shown at any given time. However, with more advanced presenters, you can have multiple active ViewModels.

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

Since the current active ViewModel(s) depends on which Presenter you are using (which lives in the view layer), Mvx core can't know how to access it/them. If this is something you think you need, I would recommend implementing your own Presenter with your own interface.

这是iOS的示例:

ICurrentViewModelPresenter.cs

ICurrentViewModelPresenter.cs

public interface ICurrentViewModelPresenter
{
    IMvxViewModel CurrentViewModel { get; }
}

CurrentViewModelPresenter.cs:

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<ICurrentViewModelPresenter>(presenter);

        return presenter;
    }
}

代码中的任意位置:

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

请注意,这些功能都没有经过测试,但是应该可以让您了解其工作原理.

Note that exactly none of this was tested, but it should give you an idea of how it would work.

这篇关于获取当前的ViewModel MvvmCross的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆