WPF框架Prism中ViewModelLocator用法介绍

作者:痕迹g 时间:2024-05-13 09:17:27 

建立连接

在WPF当中,需要为View与ViewModel建立连接, 我们需要找到View的DataContext, 如下所示:

WPF框架Prism中ViewModelLocator用法介绍

建立连接的方式

如果你使用了解WPF当中如何绑定DataContext, 你应该能想到会有下面这些方式进行:

  • XAML设置

  • Code设置 (构造函数注入 或 ViewModelLocator)

XAML的方式:

<UserControl.DataContext>
       <.../>
</UserControl.DataContext>

代码的方式:

public partial class ViewA : UserControl
   {
       public ViewA()
       {
           InitializeComponent();
           this.DataContext = null; //设定
       }
   }

如果你使用过第三方的MVVM框架, 标准的ViewModelLocator可能如下所示:

WPF框架Prism中ViewModelLocator用法介绍

嗯...确实,这些方式都可以建立View-ViewModel关系。

但是,这一切并不是Prism想表达的内容, 甚至不建议你按上面的方式去做, 因为这样几乎打破了开发的所有原则。

(我们把View与ViewModel的关系编码的方式固定了下来, 通过静态类去维护ViewModel的关系...)

Prism ViewModelLocator

在Prism当中, 你可以基于命名约定, 便能够轻松的将View/ViewModel建议关联。如下所示:

WPF框架Prism中ViewModelLocator用法介绍

假设你已经为项目添加Views/ViewModels文件夹。此时, 你的页面为ViewA, 则对应的ViewModel名称为 ViewAViewModel。

WPF框架Prism中ViewModelLocator用法介绍

下面则是错误的命名方法:

WPF框架Prism中ViewModelLocator用法介绍

当遵循了命名规范后, 是不是意味着就能够进行自动绑定? 不, 此时还需要在View当中声明,允许当前View自动装配ViewModel:

WPF框架Prism中ViewModelLocator用法介绍

细心的你会发现, 这也就是为什么, 使用VisualStudio Tmeplate Pack创建的空白项目的时候, 为什么项目会为你默认创建Views/ViewModels文件夹。

当然, 任性的我们也可以选择不遵循这个约定, 尽管它看起来似乎也能够很好的进行工作...

更改约定

实际的开发中, 我们可能有些清空无法遵循此规则, 如下所示,我们定义Controls文件夹放View, ViewModels文件夹放ViewModel:

WPF框架Prism中ViewModelLocator用法介绍

修改方式:

1.使用ViewModelLocationProvider设置默认视图类型指定的ViewModel。

ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
           {
               var viewName = viewType.FullName;
               var assemblyName = viewType.Assembly.FullName;
               var vmName = $"{viewName.Replace("Controls", "ViewModels")}ViewModel, {assemblyName}";
               return Type.GetType(vmName);
           });

该代码的最终意思就是,将原有的View命名控件命名改成了符合约定的命名。

2.使用ViewModelLocationProvider指定View与ViewModel的类型。

public void RegisterTypes(IContainerRegistry containerRegistry)
       {
           ViewModelLocationProvider.Register<ControlA, ControlAViewModel>();

//ViewModelLocationProvider.Register<ControlA>(() => new ControlAViewModel() { Text = "Hello from Factory" });
       }

来源:https://www.cnblogs.com/zh7791/p/14109905.html

标签:WPF,Prism,框架,ViewModelLocator,用法
0
投稿

猜你喜欢

  • 设置python3为默认python的方法

    2023-07-11 19:24:49
  • Python中序列的修改、散列与切片详解

    2022-10-27 14:47:58
  • python中将\\\\uxxxx转换为Unicode字符串的方法

    2023-11-04 15:20:07
  • 一文看懂JSONP原理和应用

    2024-04-23 09:10:47
  • ACCESS的参数化查询 附ASP和C#(ASP.NET)函数

    2008-01-10 12:18:00
  • Python缓存方案优化程序性能提高数据访问速度

    2022-04-11 20:36:15
  • Python内存管理实例分析

    2021-06-13 01:39:21
  • win10下oracle 11g安装图文教程

    2024-01-25 06:18:17
  • Python使用matplotlib绘图无法显示中文问题的解决方法

    2023-07-30 22:16:30
  • asp如何显示数据库中的图片和超级链接?

    2010-06-08 09:38:00
  • Python使用Cv2模块识别验证码的操作方法

    2022-07-03 14:37:19
  • 跟老齐学Python之赋值,简单也不简单

    2021-03-09 22:44:14
  • MYSQL SERVER收缩日志文件实现方法

    2024-01-26 15:14:29
  • sql server 创建临时表的使用说明

    2024-01-16 18:30:23
  • python 字符串详解

    2022-09-27 04:44:25
  • java实现数据库的数据写入到txt的方法

    2024-01-28 06:22:16
  • python清除指定目录内所有文件中script的方法

    2022-04-05 15:59:47
  • php 字符串函数收集

    2024-05-11 10:02:26
  • Python3.X 线程中信号量的使用方法示例

    2022-06-12 12:07:13
  • 详解JS几种变量交换方式以及性能分析对比

    2024-04-10 16:13:58
  • asp之家 网络编程 m.aspxhome.com