WPF框架Prism中ViewModelLocator用法介绍
作者:痕迹g 发布时间:2024-05-13 09:17:27
建立连接
在WPF当中,需要为View与ViewModel建立连接, 我们需要找到View的DataContext, 如下所示:
建立连接的方式
如果你使用了解WPF当中如何绑定DataContext, 你应该能想到会有下面这些方式进行:
XAML设置
Code设置 (构造函数注入 或 ViewModelLocator)
XAML的方式:
<UserControl.DataContext>
<.../>
</UserControl.DataContext>
代码的方式:
public partial class ViewA : UserControl
{
public ViewA()
{
InitializeComponent();
this.DataContext = null; //设定
}
}
如果你使用过第三方的MVVM框架, 标准的ViewModelLocator可能如下所示:
嗯...确实,这些方式都可以建立View-ViewModel关系。
但是,这一切并不是Prism想表达的内容, 甚至不建议你按上面的方式去做, 因为这样几乎打破了开发的所有原则。
(我们把View与ViewModel的关系编码的方式固定了下来, 通过静态类去维护ViewModel的关系...)
Prism ViewModelLocator
在Prism当中, 你可以基于命名约定, 便能够轻松的将View/ViewModel建议关联。如下所示:
假设你已经为项目添加Views/ViewModels文件夹。此时, 你的页面为ViewA, 则对应的ViewModel名称为 ViewAViewModel。
下面则是错误的命名方法:
当遵循了命名规范后, 是不是意味着就能够进行自动绑定? 不, 此时还需要在View当中声明,允许当前View自动装配ViewModel:
细心的你会发现, 这也就是为什么, 使用VisualStudio Tmeplate Pack创建的空白项目的时候, 为什么项目会为你默认创建Views/ViewModels文件夹。
当然, 任性的我们也可以选择不遵循这个约定, 尽管它看起来似乎也能够很好的进行工作...
更改约定
实际的开发中, 我们可能有些清空无法遵循此规则, 如下所示,我们定义Controls文件夹放View, ViewModels文件夹放ViewModel:
修改方式:
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
猜你喜欢
- 本文实例讲述了Python异常模块traceback用法。分享给大家供大家参考,具体如下:traceback模块被用来跟踪异常返回信息. 如
- WEB交互安全一直是个各大网站的首要解决方案,本文介绍的PHP加密类非常实用哦,带有公钥,这是最大的亮点,没有公钥是不能解密的,加密度非常高
- 1.window.event兼容脚本 2.屏蔽Form提交事件 3.获取事件源 4.添加事件兼容写法 5.Firefox注册innerTex
- Golang 是一种简洁高效的编程语言,拥有强大的并发支持和丰富的标准库。在 Golang 中,计时器(timer)是一种常见的工具,用于定
- 如何用PYTHON制作填词游戏新建一个PYTHON文档。用JUPYTER NOTEBOOK打开即可。print("Heart is
- 1.要求数据库存储通讯录,要求按姓名/电话号码查询,查询条件只有一个输入入口,自动识别输入的是姓名还是号码,允许模糊查询。2.实现功能可通过
- 本文代码实现Python多线程扫描端口,具体实现代码如下。#coding:utf-8import socketimport threadim
- 什么是事件委托/事件代理利用事件的冒泡传播机制(触发当前元素的某一个行为,它父级所有元素的相关行为都会被触发),如果一个容器中有很多元素都要
- numpy的sum函数可接受的参数是:sum(a, axis=None, dtype=None, out=None, keepdims=np
- python提取特定时间段内的数据尝试一下:data['Date'] = pd.to_datetime(data['
- 迭代器迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍
- 示例首先模拟一个业务场景,有订单、产品、自定义订单三个结构体,订单中包含多个产品:type Order struct {Id
- select * from V$NLS_PARAMETERS; SQL> alter session set NLS_DATE_LAN
- 如图输入如下命令python manage.py startapp apitest添加应用到 autotest项目项目下在settings.
- 今天将一个ACC的数据库转换成ms-sql以后发现在使用replace替换语句的时候出现: SQL中函数 replace 的参数 1 的数据
- 示例:# -*- coding:utf-8 -*-import jsonstrtest = {"中故宫":"好
- 单例模式的概念单例模式很容易记住。就像名称一样,它只能提供对象的单一实例,保证一个类只有一个实例,并提供一个全局访问该实例的方法。在第一次调
- class Helper_Page{ /** 总信息数 */ var $infoCount; /** 总页数 */ var $pageCou
- 很多人喜欢把一个网站中相同的部分象是统一的页面logo,版权声明等做成一个过程,然后放到一个include文件中,这样所有的页面就都可以使用
- 系统环境:VC6 + Python-2.5.41、下载Python-2.5.4源码。2、解压,打开D:\Python-2.5.4\PC\VC