【问题标题】:Overriding mvvmcross View locator覆盖 mvvmcross 视图定位器
【发布时间】:2015-11-06 18:43:58
【问题描述】:

我一直在重构我的工作解决方案,将多个程序集用作可重用模块。它有以下程序集

App.Framework - 解决方案各个方面的通用项目, App.Core - mvvmcross 核心, App.StartupModule - 应用程序不同部分的模块的一部分,用于其他项目的可重用性,它包含自己的存储库、服务和视图模型。 App.WindowsApp.Android

我已经设法解决了 viewodellocator 并从模块中获取类型,并使用以下内容启动应用程序,其中 startupView 是该特定模块的默认视图。

        var method = this.GetType().GetMethod("RegisterAppStart", BindingFlags.FlattenHierarchy)
            .MakeGenericMethod(startupView);
        method.Invoke(this, null);

所以应用程序一直运行通过核心,然后进入 windowsphone 应用程序,当它试图找到与 logonviewmodel 关联的视图时,它会中断。命名空间已从

App.Core.ViewModels.[VIEWMODELNAME] -> App.StartupModule.ViewModels.[VIEWMODELNAME]

这是调试跟踪的一部分,我认为它失败了

    mvx:Diagnostic: 84.00 Error seen during navigation request to LogonViewModel - error KeyNotFoundException: Could not find view for App.StartupModule.ViewModels.LogonViewModel
       at Cirrious.MvvmCross.Views.MvxViewsContainer.GetViewType(Type viewModelType)
   at Cirrious.MvvmCross.WindowsCommon.Views.MvxWindowsViewPresenter.Show(MvxViewModelRequest request)

视图位于命名空间中

App.WindowsPhone.Views

所以我想我的问题是 1. 有没有一种简单的方法来告诉 viewdispatcher/viewlocator 在项目中查找类型为 [VIEWMODELNAME] 的视图 2.覆盖映射更好吗?以及如何去做呢? 3. 还有什么其他建议可以解决这个问题? 4. 从我所见,这将需要在每个平台上实现某些东西,我猜没有通用的方法来处理所有平台?

提前致谢

【问题讨论】:

    标签: c# xamarin mvvmcross


    【解决方案1】:

    视图解析不考虑声明视图的命名空间。因此,您的视图在哪个命名空间中定义并不重要。

    按照惯例,映射工作基于类型名称。因此,如果您执行ShowViewModel<FirstViewModel>(),它将尝试查找名为 FirstView 的视图。它将尝试在本机 iOS 或 Android 应用程序的程序集中查找视图。

    如果您在不同的程序集中定义了视图,则可以覆盖特定于平台的Setup 类的AndroidViewAssemblies 属性。

    【讨论】:

    • 这就是我认为会发生的事情,但是在进行更改后,它无法再在我的 ui 项目中找到视图,这之前工作正常吗?所以不确定当时发生了什么:/
    • 我应该补充一点,我已经覆盖了导航并且正在使用这个 public void Navigate(Type viewModelType, object parameters) { ShowViewModel(viewModelType, parameters); }
    • 您是否在与原生 iOS、Windows 或 Android 项目不同的程序集中定义了视图?
    • 没有视图保持与以前相同的程序集
    • 您还确定您的视图源自任何IMvxView 派生类?例如。 MvxActivityMvxViewController 或类似的东西?
    【解决方案2】:

    好的,在许多不同的事情上多次尝试错误之后,我找到了问题的解决方案。它不是特别优雅,需要一些重构,但你需要做的。 1. 在您的 UI 项目设置中,您需要添加 Viewmodel 程序集,然后世界再次变好,解决方案继续运行,但它需要在每个平台上发生。而不是视图程序集

        protected override System.Reflection.Assembly[] GetViewModelAssemblies()
        {
          //  return base.GetViewModelAssemblies();
    
            var result = base.GetViewModelAssemblies();
            var assemblyList = result.ToList();
    
            var assemblyType = typeof(SBG.NBOL.StartupModule.ViewModels.LogonViewModel);
            assemblyList.Add(assemblyType.GetTypeInfo().Assembly);
            return assemblyList.ToArray();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多