【问题标题】:MvvmCross cannot find override method for mapping view model to viewMvvmCross 找不到将视图模型映射到视图的覆盖方法
【发布时间】:2016-03-10 07:03:04
【问题描述】:

Setup 类方法或层次结构是否发生了变化?我似乎无法在 Setup 类中找到一个名为 GetViewModelViewLookup 的方法来覆盖

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

我正在尝试以下方法

protected override IDictionary<Type, Type> GetViewModelViewLookup()

但它告诉我没有一个名为 this 的方法可以覆盖。我正在尝试按照旧 MvvmCross 博客 link 上的示例进行操作

有什么想法吗?

更新 * 它看起来好像基类曾经是包含GetViewModelToViewLookupMvxBaseSetup,但现在它只是不包含它的MvxSetup

那么我现在如何覆盖视图模型以查看映射?

【问题讨论】:

    标签: view xamarin mapping xamarin.android mvvmcross


    【解决方案1】:

    如果你只是想改变命名方案,覆盖的函数是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();
        }
    }
    

    【讨论】:

    • 感谢 Sven,我的问题是我希望将同一个视图模型映射到多个视图。这破坏了字典键的唯一性。对于 Xamarin iOS,是否有通过另一种机制来做到这一点?
    • 有可能,但您需要另一种方法。但是要找到正确的方法,您必须更多地说明您的要求。在导航到 ViewModelAB 时,您想根据哪些条件决定查看 ViewA 还是 ViewB ?
    • 我有一个场景,我有一个摘要视图,单击它时我想显示详细视图。我希望两者都使用相同的视图模型,因为摘要视图数据只是详细视图数据的子集
    • 对于这种情况,最简单的解决方案是从您的SummaryViewModel 继承一个“空”DetailViewModel 以建立一对一的连接。还有更复杂的解决方案。但我认为对于少数情况来说,这将是太多的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多