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,因为它负责向INavigationServiceViewModel 提供正确的实例。在开发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)的更多相关文章

随机推荐

  1. Linux 使用 docker 下搭建xunsearch 搜索引擎服务

    Linux 使用 docker 下搭建 xunsearch 搜索引擎服务 安装 docker 环境(菜鸟教程有说明) 安装docker说明 下载并运行 xunsearch 的服务端:docker安装x ...

  2. 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)

    题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...

  3. CSS 3D图片翻转 ——3D Flipping Effect

    效果: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  4. 简单实现jquery轮播图

    首先需要定义个切换图片的funcation ##### 1.找到图片所在li,将其显示出来,并缩放1.1倍 ##### 2.其他兄弟li,渐变隐藏,并还原至原大小比例 ##### 3.将底部的圆点列表 ...

  5. [TimLinux] JavaScript AJAX接收到的数据转换为JSON格式

    1. 接收数据 AJAX接收数据是通过xhr.responseText属性,这是一个属性不是一个方法,这个属性得到的数据为字符串. 2. 字符串内容 当服务器发送的是一个JsonResponse({' ...

  6. BZOJ 3033 太鼓达人(DFS+欧拉回路)

    Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员XLk.Poet_shy和ly ...

  7. Selenium 4.0 Alpha更新实践

    上期讲到了Selenium 4.0 Alpha更新日志,这次来实践一下更新内容. DevTools操作更加方便. Chrome录制更加方便.(未实践) 窗口管理不在依赖一个driver. 相对定位器功 ...

  8. CyAPI环境搭建

    http://jingyan.baidu.com/article/e6c8503c0690cee54f1a1893.html

  9. 【JS】379- 教你玩转数组 reduce

    reduce 是数组迭代器(https://jrsinclair.com/articles/2017/javascript-without-loops/)里的瑞士军刀.它强大到您可以使用它去构建大多数 ...

  10. Java工作流系统jflow向工作处理器传值的方法大全

    关键词:工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流 bpm工作流系统  java工作流主流框架  自定义工作流引擎 表单设计器  流程设计器 在启动开始节点时, ...