覆盖 mvvmcross 视图定位器
Overriding mvvmcross View locator
我一直在重构我的工作解决方案,将多个程序集用作可重用模块。它有以下组件
App.Framework - 解决方案各个方面的共同项目,
App.Core - mvvmcross 核心,
App.StartupModule - 应用程序不同部分的部分模块,用于其他项目的可重用性,它包含自己的存储库、服务和视图模型。
App.Windows,
App.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. 据我所知,这将需要在每个平台上实现某些东西,我猜没有通用的方法来处理所有平台?
提前致谢
视图解析不考虑声明视图的命名空间。因此,您的视图在哪个命名空间中定义并不重要。
按照惯例,映射基于类型名称工作。因此,如果您执行 ShowViewModel<FirstViewModel>()
,它将尝试查找名为 FirstView 的视图。它将尝试在本机 iOS 或 Android 应用程序的程序集中查找视图。
如果您在不同的程序集中定义了视图,则可以覆盖平台特定的 AndroidViewAssemblies
属性 Setup
class.
好的,在对许多不同的事情进行多次试错之后,我找到了解决问题的方法。它不是特别优雅,需要一些重构,但你需要做的。
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();
}
我一直在重构我的工作解决方案,将多个程序集用作可重用模块。它有以下组件
App.Framework - 解决方案各个方面的共同项目, App.Core - mvvmcross 核心, App.StartupModule - 应用程序不同部分的部分模块,用于其他项目的可重用性,它包含自己的存储库、服务和视图模型。 App.Windows, App.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. 据我所知,这将需要在每个平台上实现某些东西,我猜没有通用的方法来处理所有平台?
提前致谢
视图解析不考虑声明视图的命名空间。因此,您的视图在哪个命名空间中定义并不重要。
按照惯例,映射基于类型名称工作。因此,如果您执行 ShowViewModel<FirstViewModel>()
,它将尝试查找名为 FirstView 的视图。它将尝试在本机 iOS 或 Android 应用程序的程序集中查找视图。
如果您在不同的程序集中定义了视图,则可以覆盖平台特定的 AndroidViewAssemblies
属性 Setup
class.
好的,在对许多不同的事情进行多次试错之后,我找到了解决问题的方法。它不是特别优雅,需要一些重构,但你需要做的。 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();
}