Prism_ViewModelLocator(5)
ViewModelLocator
ViewModelLocator
用于绑定视图的DataContext
,以使用标准命名约定的一个ViewModel的实例。
Prism ViewModelLocator
有一个AutoWireViewModel
附加属性,当设置为true
调用类中的AutoWireViewModelChanged
方法ViewModelLocationProvider
来解析视图的ViewModel时,然后将视图的数据上下文设置为该ViewModel的实例。
将AutoWireViewModel
附加属性添加到每个视图:
<Window x:Class="Demo.Views.MainWindow"
...
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">
要查找ViewModel,ViewModelLocationProvider
首先尝试从ViewModelLocationProvider.Register
方法注册的任何映射中解析ViewModel (请参阅自定义ViewModel注册)。如果使用此方法无法解析ViewModel,则会ViewModelLocationProvider
回退到基于约定的方法来解析正确的ViewModel类型。
该惯例假定:
- ViewModel与视图类型位于同一个程序集中
- ViewModel位于
.ViewModels
子命名空间中 - 视图位于
.Views
子命名空间中 - ViewModel名称与视图名称对应,以“ViewModel”结尾。
注意
本ViewModelLocationProvider
可以在发现Prism.Mvvm
命名空间中的Prism.Core NuGet包。本ViewModelLocator
可以在发现Prism.Mvvm
命名空间中的Prism.WPF NuGet包。
注意
ViewModelLocator是必需的,并且在使用Xamarin.Forms进行开发时会自动应用于每个View,因为它负责向INavigationService
ViewModel 提供正确的实例。在开发Xamarin.Forms应用程序时,ViewModelLocator
只能选择退出。
视频教程1
[Using the ViewModelLocator视频教程](Prism.assets/Prism - Using the ViewModelLocator.mp4)
更改命名约定
如果您的应用程序不遵循ViewModelLocator
默认命名约定,则可以更改约定以满足应用程序的要求。本ViewModelLocationProvider
类提供了一个称为静态方法SetDefaultViewTypeToViewModelTypeResolver
,可以用来提供自己的约定关联视图查看模型。
要更改ViewModelLocator
命名约定,请覆盖类中的ConfigureViewModelLocator
方法App.xaml.cs
。然后在ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver
方法中提供自定义命名约定逻辑。
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
{
var viewName = viewType.FullName.Replace(".ViewModels.", ".CustomNamespace.");//看视频就明白了
var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
var viewModelName = $"{viewName}ViewModel, {viewAssemblyName}";
return Type.GetType(viewModelName);
});
}
视频教程2
[Changing the ViewModelLocator Naming Convention视频教程](Prism.assets/Prism - Changing the ViewModelLocator Naming Convention.mp4)
自定义ViewModel注册
可能存在您的应用程序遵循ViewModelLocator
默认命名约定的情况,但您有许多不符合约定的ViewModel。您可以ViewModelLocator
使用该ViewModelLocationProvider.Register
方法直接将ViewModel的映射注册到特定视图,而不是尝试自定义命名约定逻辑以有条件地满足所有命名要求。
以下示例显示了在名为MainWindow
的ViewModel和ViewModel 之间创建映射的各种方法CustomViewModel
。
类型/类型
ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), typeof(CustomViewModel));
类型/工厂
ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), () => Container.Resolve<CustomViewModel>());
通用工厂
ViewModelLocationProvider.Register<MainWindow>(() => Container.Resolve<CustomViewModel>());
通用类型
ViewModelLocationProvider.Register<MainWindow, CustomViewModel>();
注意
直接注册ViewModel ViewModelLocator
比依赖默认命名约定更快。这是因为命名约定需要使用反射,而自定义映射直接提供类型ViewModelLocator
。
重要
该viewTypeName
参数必须是视图的Type(Type.ToString()
)的完全限定名称。否则映射将失败。
视频教程3
[ViewModelLocator Custom Registrations视频教程](Prism.assets/Prism - ViewModelLocator Custom Registrations.mp4)
控制ViewModel的解析方式
默认情况下,ViewModelLocator
将使用您选择的DI容器来创建Prism应用程序以解析ViewModels。但是,如果您需要自定义ViewModel的解析方式或完全更改解析器,则可以使用该ViewModelLocationProvider.SetDefaultViewModelFactory
方法实现此目的。
此示例显示如何更改用于解析ViewModel实例的容器。
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
ViewModelLocationProvider.SetDefaultViewModelFactory(viewModelType) =>
{
return MyAwesomeNewContainer.Resolve(viewModelType);
});
}
这是一个示例,说明如何检查为其创建ViewModel的视图类型,以及执行逻辑来控制ViewModel的创建方式。
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
ViewModelLocationProvider.SetDefaultViewModelFactory((view, viewModelType) =>
{
switch (view)
{
case Window window:
//your logic
break;
case UserControl userControl:
//your logic
break;
}
return MyAwesomeNewContainer.Resolve(someNewType);
});
}
Prism_ViewModelLocator(5)的更多相关文章
随机推荐
- Linux 使用 docker 下搭建xunsearch 搜索引擎服务
Linux 使用 docker 下搭建 xunsearch 搜索引擎服务 安装 docker 环境(菜鸟教程有说明) 安装docker说明 下载并运行 xunsearch 的服务端:docker安装x ...
- 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)
题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...
- CSS 3D图片翻转 ——3D Flipping Effect
效果: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- 简单实现jquery轮播图
首先需要定义个切换图片的funcation ##### 1.找到图片所在li,将其显示出来,并缩放1.1倍 ##### 2.其他兄弟li,渐变隐藏,并还原至原大小比例 ##### 3.将底部的圆点列表 ...
- [TimLinux] JavaScript AJAX接收到的数据转换为JSON格式
1. 接收数据 AJAX接收数据是通过xhr.responseText属性,这是一个属性不是一个方法,这个属性得到的数据为字符串. 2. 字符串内容 当服务器发送的是一个JsonResponse({' ...
- BZOJ 3033 太鼓达人(DFS+欧拉回路)
Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和ly ...
- Selenium 4.0 Alpha更新实践
上期讲到了Selenium 4.0 Alpha更新日志,这次来实践一下更新内容. DevTools操作更加方便. Chrome录制更加方便.(未实践) 窗口管理不在依赖一个driver. 相对定位器功 ...
- CyAPI环境搭建
http://jingyan.baidu.com/article/e6c8503c0690cee54f1a1893.html
- 【JS】379- 教你玩转数组 reduce
reduce 是数组迭代器(https://jrsinclair.com/articles/2017/javascript-without-loops/)里的瑞士军刀.它强大到您可以使用它去构建大多数 ...
- Java工作流系统jflow向工作处理器传值的方法大全
关键词:工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 bpm工作流系统 java工作流主流框架 自定义工作流引擎 表单设计器 流程设计器 在启动开始节点时, ...