在 Prism 中使用特征文件夹
Use Feature Folders with Prism
我有一个使用 Prism 的 Xamarin.Forms 项目,视图和视图模型的数量越来越多,变得难以处理。
在网络项目中,我通常使用功能文件夹,将相关代码组合在一起,例如:
- 特点
- 首页
- 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 以在这些位置而不是 Views
和 ViewModels
个文件夹?
您可以手动为视图注册视图模型,也可以修改 ViewModelLocator
用于查找视图视图模型的约定。
可以找到示例 ,虽然这只是复制了原始约定,但它显示了从哪里开始修改:
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver( viewType => viewModelType );
此外,this blog post 描述了如何更改约定以查找位于同一文件夹中除视图之外的视图模型:
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。我们建议您在注册时简单地指定 View 和 ViewModel。这要快得多,因为它避免了任何反射查找。
containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>();
我有一个使用 Prism 的 Xamarin.Forms 项目,视图和视图模型的数量越来越多,变得难以处理。
在网络项目中,我通常使用功能文件夹,将相关代码组合在一起,例如:
- 特点
- 首页
- 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 以在这些位置而不是 Views
和 ViewModels
个文件夹?
您可以手动为视图注册视图模型,也可以修改 ViewModelLocator
用于查找视图视图模型的约定。
可以找到示例
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver( viewType => viewModelType );
此外,this blog post 描述了如何更改约定以查找位于同一文件夹中除视图之外的视图模型:
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。我们建议您在注册时简单地指定 View 和 ViewModel。这要快得多,因为它避免了任何反射查找。
containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>();