在MvxViewContainer中有一个_bindingMap,用于将ViewModel映射到Views,以便“FirstViewModel”映射到“FirstView”。对于我的MvvmCross for Mac版本,我想改为映射“FirstViewController”。实际上,不知怎的,它知道什么时候“FirstView”是一个MvxViewController来做正确的事情。这是如何工作的?
public virtual IMvxMacView CreateView(MvxViewModelRequest request)
{
try
{
CurrentRequest = request;
var viewType = GetViewType(request.ViewModelType);
我要求当前版本(v3)。
答案 0 :(得分:3)
从the wiki开始,使用[MvxViewFor(typeof(YourViewModel))]
可能是最简单的解决方案:
默认情况下,MvvmCross使用按名称约定发现的ViewModel类型发现View与之关联的ViewModel
这使得原型初始应用程序通常非常简单。
然而,随着应用程序的大小和复杂性的增加,有时开发人员喜欢覆盖此查找行为。
要做到这一点,他们可以改为:
提供ViewModel的具体类型,其中指定了一个 - 例如为:
public new DetailViewModel ViewModel
{
get { return base.ViewModel as DetailViewModel; }
set { base.ViewModel = value; }
}
或提供使用MvxViewForAttribute
指定的明确类型的ViewModel
此外,在每微秒启动时间必不可少的情况下,它们还可以通过覆盖InitializeViewLookup
方法来帮助减少反射开销 - 例如
protected override void InitializeViewLookup()
{
var viewModelViewLookup = new Dictionary<Type, Type>()
{
{ typeof (FirstViewModel), typeof(FirstView) },
{ typeof (SecondViewModel), typeof(SecondView) },
//
{ typeof (UmpteenthViewModel), typeof(UmpteenthView) },
};
var container = Mvx.Resolve<IMvxViewsContainer>();
container.AddAll(viewModelViewLookup);
}