Ale*_*nko 4 c# mvvm xamarin.android mvvmcross xamarin
奇怪的是,我没有找到对互联网上这个非常简单的问题的直接回答.
如何ViewModel在MvvmCross运行时确定当前活动?
可能吗?如果没有,为什么我不应该这样做?
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)
请注意,这些都没有经过测试,但它应该让您了解它是如何工作的.