奇怪的是,我没有在网上找到这个非常简单的问题的直接答案。
如何确定 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/