c# - 获取当前 ViewModel MvvmCross

标签 c# mvvm xamarin.android xamarin mvvmcross

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

如何确定 MvvmCross 运行时中当前事件的 ViewModel

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

最佳答案

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

由于当前事件的 ViewModel(s) 取决于您正在使用的 Presenter(位于 View 层),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();
        }
    }
}

设置.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;

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

关于c# - 获取当前 ViewModel MvvmCross,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22465026/

相关文章:

c# - autofac/c#: A generic factory for a specific base class?

silverlight - 如何在 MVVM 中的两个 View 之间传递模型对象(在 View 中完成数据绑定(bind))

android - Xamarin Android 应用程序在 Release模式下崩溃

javascript - C# 中 JavaScript 中的变量

c# - Application.Quit() 不会退出应用程序

android - Android LiveData : How to do an ArrayList<LiveData<RetrofitObject>>?

c# - 为什么 INotifyPropertyChanged 在 Model 和 ViewModel 中都有?

Xamarin Android 将音频文件与 FFMpeg 合并

android - 如何防止 NavigationDrawer 通过手势打开,但允许从支持设计库 23.1.1.1 中的汉堡包图标打开

c# - 浏览到目录并将路径存储在字符串中 (C#)