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

查看:18
本文介绍了获取当前的 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(s) 取决于您使用的 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 的示例:

Here's an example for 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天全站免登陆