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)的更多相关文章
随机推荐
- Spring MVC中的Controller是Serlvet吗?
1. Controller不是Servlet DispatcherServler是Spring MVC中的唯一Servlet,(这点可通过查看FrameworkServlet的子类确认) Servle ...
- Swoole高效跟传统的web开发有什么区别?
一.swoole的运行模式 Swoole高效跟传统的web开发有什么区别,除了传统的LAMP/LNMP同步开发模式,swoole的异步开发模式是怎么样的. 1.1.传统web开发模式 PHP web开 ...
- React Context上下文
目录 前言 一 context旧版使用步骤 1.1 根组件childContextTypes属性 1.2 根组件getChildContext方法 1.3 子组件contextTypes静态属性 1. ...
- vmware虚拟机扩大硬盘
记录一下对vmware虚拟机扩大硬盘的过程.操作有风险,重要数据请先进行备份. 1.首先在vcenter中将虚拟机下电,然后编辑虚拟机,将虚拟机硬盘扩大.具体操作见下图 2.打开虚拟机电源,利用fdi ...
- [TimLinux] JavaScript table的td内容超过宽度缩为三个点
1. 思路 CSS控制td内容自动缩为三个点 JS控制鼠标悬浮显示td全部内容 2. 实现 HTML代码: <!DOCTYPE html> <html> <head> ...
- python学习笔记—DataFrame和Series的排序
更多大数据分析.建模等内容请关注公众号<bigdatamodeling> ################################### 排序 ################## ...
- mongodb验证
mongodb默认是不需要用户名和密码就可以增删查改的.要设置成需要用户名和密码访问,步骤如下: 通过下面的命令启动mongodb服务器 mongod 启动之后再登录,执行下面命令: use test ...
- 【简明翻译】Hibernate 5.4 Getting Started Guide 官方入门文档
前言 最近的精力主要集中在Hibernate上,在意识到Hibernate 5 的中文资料并不多的时候,我不得不把目光转向Hibernate的官方doc,学习之余简要翻一下入门文档. 原文地址:htt ...
- 深入理解 Java 反射和动态代理
- poj 2513 Colored Sticks (trie树+并查集+欧拉路)
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 40043 Accepted: 10406 ...