1

在 MvxViewContainer 中有一个 _bindingMap 用于将 ViewModels 映射到 Views 以便“FirstViewModel”映射到“FirstView”。对于我的 Mac 版 MvvmCross,我想改为制作映射“FirstViewController”。实际上,它知道“FirstView”何时是 MvxViewController 来做正确的事情。这是如何运作的?

public virtual IMvxMacView CreateView(MvxViewModelRequest request)
{
    try
    {
        CurrentRequest = request;
        var viewType = GetViewType(request.ViewModelType);

我要的是当前版本(v3)。

4

1 回答 1

4

wiki, using[MvxViewFor(typeof(YourViewModel))]可能是最简单的解决方案:

覆盖 View-ViewModel 关联

默认情况下,MvvmCross 使用按名称约定发现的 ViewModel 类型发现 View 关联的 ViewModel

这使得原型初始应用程序的功能通常非常简单。

然而,随着应用程序的规模和复杂性的增长,有时开发人员喜欢覆盖这种查找行为。

为此,他们可以:

  • 提供 ViewModel 的具体类型,其中指定了一个 - 例如:

        public new DetailViewModel ViewModel
            {
                 get { return base.ViewModel as DetailViewModel; }
                 set { base.ViewModel = value; }
            }
    
  • 或提供使用指定的 ViewModel 的显式类型MvxViewForAttribute

此外,在每微秒的启动时间都很重要的情况下,它们还可以通过覆盖该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);
    }
于 2013-09-21T09:38:58.747 回答