如何填充_bindingMap?

时间:2013-09-20 21:17:05

标签: mvvmcross

在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)。

1 个答案:

答案 0 :(得分:3)

the wiki开始,使用[MvxViewFor(typeof(YourViewModel))]可能是最简单的解决方案:

覆盖View-ViewModel关联

默认情况下,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);
    }