【问题标题】:Get current ViewModel MvvmCross获取当前 ViewModel MvvmCross
【发布时间】:2014-03-17 20:47:13
【问题描述】:

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

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

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

【问题讨论】:

  • 您能否尝试编辑您的“非常简单的问题”,以便帮助其他人解决您的问题。什么是当前活动的 ViewModel?你在哪里问?是否有任何代码或伪代码可以帮助其他人理解您在说什么。 Jon Skeet 有一些关于在msmvps.com/blogs/jon_skeet/archive/2012/11/24/… 上提出好问题的建议
  • 好吧,当应用程序运行时,总是有一个活动视图显示在屏幕上。显然是一个对应于这个视图的活动视图模型。是否有一个全局环境变量或方法或任何我可以用来确定这个“活动”视图模型?

标签: c# mvvm xamarin.android xamarin mvvmcross


【解决方案1】:

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

由于当前活动的 ViewModel(s) 取决于您使用的 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;

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

【讨论】:

  • 谢谢博格纳,我明白了。现在我明白了为什么没有标准的方法来做到这一点。
【解决方案2】:

如果您只想从 ViewModel 中查看它是否处于活动状态/可见状态,另一种方法是拥有一个布尔字段并在 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 来检查。

【讨论】:

    猜你喜欢
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多