获取当前的ViewModel MvvmCross

时间:2014-03-17 20:47:13

标签: c# mvvm xamarin.android xamarin mvvmcross

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

如何确定ViewModel运行时中当前有效的MvvmCross

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

2 个答案:

答案 0 :(得分:13)

正如我最近了解到的那样,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<ICurrentViewModelPresenter>(presenter);

        return presenter;
    }
}

代码中的任何地方:

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

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

答案 1 :(得分:0)

如果您只想从 ViewModel 中查看它是否处于活动/可见状态,另一种方法就是拥有一个 bool 字段并在 ViewAppeared / ViewDisappeared 上更新它:

public class MyViewModel : MvxViewModel
{
    private bool _isVisible;

    public override void ViewAppeared()
    {
        base.ViewAppeared();

        _isVisible = true;
    }

    public override void ViewDisappeared()
    {
        base.ViewDisappeared();

        _isVisible = false;
    }
}

大多数情况下这已经足够了,您可以使用 _isVisible 来检查。