MvvmCross无法找到用于将视图模型映射到视图的覆盖方法

时间:2016-03-07 15:41:56

标签: view xamarin mapping xamarin.android mvvmcross

Setup类方法或层次结构是否已更改?我似乎无法在Setup类

中找到一个名为GetViewModelViewLookup的方法

我正在尝试将视图映射到不同的视图模型。我正在使用MvvmCross 3.5.1

我正在尝试以下

protected override IDictionary<Type, Type> GetViewModelViewLookup()

但它告诉我没有一个名为this的方法来覆盖。我试图按照旧版MvvmCross博客上的示例link

有什么想法吗?

更新*看起来基类曾经是MvxBaseSetup,其中包含GetViewModelToViewLookup,但现在只有MvxSetup不包含它。

那么如何覆盖viewmodel以立即查看映射?

1 个答案:

答案 0 :(得分:0)

如果您只想更改命名方案,则覆盖的功能为CreateViewToViewModelNaming

public class Setup : MvxAndroidSetup
{
    public Setup(Context applicationContext) : base(applicationContext)
    {
    }

    protected override IMvxNameMapping CreateViewToViewModelNaming()
    {
        return new ReverseViewModelNaming();
    }

    protected override IMvxApplication CreateApp()
    {
        return new Core.App();
    }

    protected override IMvxTrace CreateDebugTrace()
    {
        return new DebugTrace();
    }
}

class ReverseViewModelNaming : IMvxNameMapping
{
    public string Map(string inputName)
    {
        // MyView is presented by the view model named weiVyM (how useful :P)
        return string.Join("", inputName.Reverse());
    }
}

如果要更改映射,则要覆盖的函数为InitializeViewLookup。如果您只想添加一些额外的映射,请致电base.InitializeViewLookup()

public class Setup : MvxAndroidSetup
{
    public Setup(Context applicationContext) : base(applicationContext)
    {
    }

    protected override void InitializeViewLookup()
    {
        var registry = new Dictionary<Type, Type>()
        {
            { typeof(FirstViewModel), typeof(FirstActivity) }, 
            { typeof(HomeViewModel), typeof(HomeActivity) } ,
            { typeof(DetailViewModel), typeof(DetailActivity) }, 
            { typeof(UploadViewModel), typeof(UploadActivity) }
        };
        var container = Cirrious.CrossCore.Mvx.Resolve<IMvxViewsContainer>();
        container.AddAll(registry);
    }

    protected override IMvxApplication CreateApp()
    {
        return new Core.App();
    }

    protected override IMvxTrace CreateDebugTrace()
    {
        return new DebugTrace();
    }
}