Mvvm 将要素文件夹与Prism一起使用

Mvvm 将要素文件夹与Prism一起使用,mvvm,xamarin.forms,prism,code-structure,Mvvm,Xamarin.forms,Prism,Code Structure,我有一个使用Prism的Xamarin.Forms项目,视图和视图模型的数量越来越庞大 在web项目中,我通常使用功能文件夹,将相关代码分组在一起,例如: 特征 家 Home.cshtml Home.cs Home.js HomeController.cs 小部件 List.cshtml List.cs List.js Detail.cshtml Detail.cs Detail.js WidgetsController.cs 我想在Xamarin.Forms项目中做同样的事情,

我有一个使用Prism的Xamarin.Forms项目,视图和视图模型的数量越来越庞大

在web项目中,我通常使用功能文件夹,将相关代码分组在一起,例如:

  • 特征
      • Home.cshtml
      • Home.cs
      • Home.js
      • HomeController.cs
    • 小部件
      • List.cshtml
      • List.cs
      • List.js
      • Detail.cshtml
      • Detail.cs
      • Detail.js
      • WidgetsController.cs

我想在Xamarin.Forms项目中做同样的事情,但是我不知道如何配置Prism来查找这些位置的视图和视图模型,而不是
视图
视图模型
文件夹?

您可以手动为视图注册视图模型,或者修改
视图模型定位器
用于查找视图模型的约定

可以找到一个示例,尽管这只是复制了原始约定,但它显示了从何处开始修改:

ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver( viewType => viewModelType );
此外,介绍如何更改约定以查找位于同一文件夹中视图之外的视图模型:

ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
{
    var viewName = viewType.FullName;
    var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
    var viewModelName = String.Format(CultureInfo.InvariantCulture, “{0}ViewModel, {1}”, viewName, viewAssemblyName);
    return Type.GetType(viewModelName);
});

您可以手动为视图注册视图模型,也可以修改
ViewModelLocator
用于查找视图模型的约定

可以找到一个示例,尽管这只是复制了原始约定,但它显示了从何处开始修改:

ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver( viewType => viewModelType );
此外,介绍如何更改约定以查找位于同一文件夹中视图之外的视图模型:

ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
{
    var viewName = viewType.FullName;
    var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
    var viewModelName = String.Format(CultureInfo.InvariantCulture, “{0}ViewModel, {1}”, viewName, viewAssemblyName);
    return Type.GetType(viewModelName);
});

虽然@Haukinger在技术上是正确的,但您可以设置ViewModelLocationProvider。我们建议您只需在注册时指定视图和视图模型。这会更快,因为它避免了任何反射查找

containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>();
containerRegistry.RegisterForNavigation();

虽然@Haukinger在技术上是正确的,但您可以设置ViewModelLocationProvider。我们建议您只需在注册时指定视图和视图模型。这会更快,因为它避免了任何反射查找

containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>();
containerRegistry.RegisterForNavigation();

没错,这就是我所说的“您可以[…]为视图手动注册视图模型”的意思。建议手动注册视图和视图模型,而不是使用
SetDefaultViewTypeToViewModelTypeResolver
?(我知道您的示例使用DI,但也可以使用
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver
使用DI)当依赖ViewModelLocationProvider根据约定自动解析ViewModel时,反射查找成本可能很高,尤其是在Tier 2-3设备上。通过在引导方法
App.RegisterTypes
中显式映射关系,您提供了显式映射,允许它绕过任何反射成本。简单地说,它要快得多。对,这就是我所说的“您可以[…]手动注册视图模型以获取视图”推荐手动注册视图和视图模型的原因是什么,而不是使用
SetDefaultViewTypeToViewModelTypeResolver
?(我知道您的示例使用DI,但也可以使用
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver
使用DI)当依赖ViewModelLocationProvider根据约定自动解析ViewModel时,反射查找成本可能很高,尤其是在Tier 2-3设备上。通过在引导方法
App.RegisterTypes
中显式映射关系,您提供了显式映射,允许它绕过任何反射成本。简单地说,它要快得多。