获取当前的ViewModel MvvmCross

Ale*_*nko 4 c# mvvm xamarin.android mvvmcross xamarin

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

如何ViewModelMvvmCross运行时确定当前活动?

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

Bog*_*nar 13

正如我最近才知道,这是视图模型"活动"依赖大量上演示使用.如果您只使用默认的演示者,这似乎很容易,因为在任何给定时间只显示一个ViewModel.但是,对于更高级的演示者,您可以拥有多个活动的ViewModel.

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

这是iOS的一个例子:

ICurrentViewModelPresenter.cs

public interface ICurrentViewModelPresenter
{
    IMvxViewModel CurrentViewModel { get; }
}
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

代码中的任何位置:

var presenter = Mvx.Resolve<ICurrentViewModelPresenter>(); // or inject with IoC
var current = presenter.CurrentViewModel;
Run Code Online (Sandbox Code Playgroud)

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