WPF入门到跪下 第十一章 Prism(四)View与ViewModel的自动关联

View与ViewModel的自动关联

一、ViewModelLocator

在学习MvvmLight框架时,也使用了ViewModelLocator类。但在MvvmLight框架中,ViewModelLocator只是一个自定义类,与框架无关,目的就是初始化IoC容器。而在Prism框架中则不同,Prism框架内置了ViewModelLocator类,并且可以帮助我们进行ViewViewModel层之间的绑定。

1、使用示例

先查看一下整个使用过程,再进行解析。

程序集中,创建Views文件夹、ViewModels文件夹,将MainWindow.xaml放入Views文件夹中,并再ViewModels文件夹中创建MainWindowViewModel类

注意,在移动MainWindow.xaml时,切记要修改命名空间(xaml文件中的x:Class属性以及后台代码中的命名空间)

public class MainWindowViewModel:BindableBase
{
    private int value;

    public int Value
    {
        get { return value; }
        set
        {
            SetProperty(ref this.value, value);
        }
    }
}

在这里插入图片描述

在MainWindow.xaml中进行Prism命名空间的引入以及ViewModelLocator.AutoWireViewModel属性的设置

需要注意,AutoWireViewModel默认就是为True,表示自动关联ViewModel,因此这个命名空间引入以及设置属性的步骤是可以省略的。

<Window ......
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
				......>
    <Grid>
        <TextBlock Text="{Binding Value}"/>
    </Grid>
</Window>

2、关联规则

通过ViewModelLocator进行View与ViewModel层的自动关联,有以下几点规则:

  • ViewModel与视图类型位于同一个程序集中
  • ViewModel位于.ViewModels子命名空间中,测试后发现其实.ViewModel子命名空间中也可以。
  • View位于.Views子命名空间中,测试后发现其实.View子命名空间中也可以。
  • ViewModel名称与视图名称对应,以ViewModel结尾。这里有一点需要注意的,如果视图的名称本身就是以View结尾的,例如StudentView,那么ViewModel名称中只要一个View就可以了,也就是StudentViewModel。

二、个性化配置

1、关联规则配置

这里以PrismApplication启动方式为例,在Prism框架中,会自动将View与ViewModel进行关联,其关联规则如上文所述。

默认关联过程大致如下:

  • 规定视图层的类型必须放在.Views命名控件的子空间下,然后将命名空间中的Views替换成ViewModels,来获得对应的视图模型的所在命名空间,例如Schuyler.Views -> Schuyler.ViewModels
  • 获得视图层的类类型后,检查类类型的全名是不是以View结尾,如果是则在尾部添加Model,否则则添加ViewModel,以此来获得视图层类类型所对应的视图模型层的类类型。
  • 通过视图层类类型命名空间获取到视图模型层的类类型后,将该视图模型层的实例对象设置为对应视图层实例对象的DataContext

根据上述关联过程,想要修改默认的关联规则,只需要在启动类(App)中,重写PrismApplication类的ConfigureViewModelLocator方法,并在方法中通过ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver方法来进行关联过程的修改即可。

ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(Func<Type, Type> viewTypeToViewModelTypeResolver):设置默认的视图类型与视图模型类型的分析器。

  • viewTypeToViewModelTypeResolver:接收一个Type类型参数,并返回一个Type类型的Func委托。接收的Type为视图类的类类型,而从哪个命名空间获取这个类类型应该是根据启动时设置的主窗口的所在命名空间来定下的。返回的Type则是根据接收到的Type参数的命名空间转化后获得的对应视图模型的类类型。

具体实现代码如下:

前提是使用PrismApplication进行项目启动,实现方式可以翻看前文。

这里是将ViewTest作为存放View类型的文件夹、ViewModelTest则是用来存放ViewModel类型的文件夹。

public partial class App : PrismApplication
{
    protected override Window CreateShell()
    {
        return Container.Resolve<ViewTest.MainWindow>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        
    }

    protected override void ConfigureViewModelLocator()
    {
        base.ConfigureViewModelLocator();
        ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(ViewTypeToViewModelTypeResolver);
    }

    private Type ViewTypeToViewModelTypeResolver(Type viewType)
    {
        var viewName = viewType.FullName;
        //获得视图模型的命名空间
        var viewModelName = viewName.Replace(".ViewTest.", ".ViewModelTest.");
        //判断视图类是不是以Window结尾,是则去掉
        if (viewModelName.EndsWith("Window"))
        {
            viewModelName = viewModelName.Substring(0, viewModelName.Length - 6);
        }
        //判断是不是以View结尾
        if (viewModelName.EndsWith("View"))
        {
            viewModelName += "Model";
        }
        else
        {
            viewModelName += "ViewModel";
        }
        return Type.GetType(viewModelName);
    }

}

2、独立关联规则配置

上面所说得关联规则配置指的是整个项目内都必须遵守的,而有些时候只希望配置某对View与ViewModel的关联规则,比如View与ViewModel可能不再一个程序集、不在指定目录、类型名字不匹配等。

此时则需要重写PrismApplication类的ConfigureViewModelLocator方法,并在方法中通过调用ViewModelLocationProvider.Register方法来进行单独的配置,具体由如下四种配置方法:

public partial class App : PrismApplication
{
    protected override Window CreateShell()
    {
        //创建主窗口对象
        return Container.Resolve<ViewTest.MainWindow>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        //这里进行IOC容器管理类型的注册
    }

    protected override void ConfigureViewModelLocator()
    {
        base.ConfigureViewModelLocator();
        //方式1:通过 类型名称/类型
        //ViewModelLocationProvider.Register(typeof(ViewTest.MainWindow).ToString(), typeof(ViewModelTest.MainViewModel));
        //方式2:通过 类型/工厂
        //ViewModelLocationProvider.Register(typeof(ViewTest.MainWindow).ToString(), 
        //    ()=>Container.Resolve<ViewModelTest.MainViewModel>());
        //方式3:通过 泛型/工厂
        //ViewModelLocationProvider.Register<ViewTest.MainWindow>(() => Container.Resolve<ViewModelTest.MainViewModel>());
        //方式4:通过 泛型
        ViewModelLocationProvider.Register<ViewTest.MainWindow, ViewModelTest.MainViewModel>();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/349814.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机房及设备安全智慧监管AI+视频方案的设计和应用

一、背景分析 随着互联网的迅猛发展&#xff0c;机房及其配套设施的数量持续攀升&#xff0c;它们的运行状况对于企业运营效率和服务质量的影响日益显著。作为企业信息化的基石&#xff0c;机房的安全监测与管理的重要性不容忽视。它不仅关乎企业的稳定运营&#xff0c;同时也…

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示 el-table列属性中带的有show-overflow-tooltip&#xff0c;可以设置内容超出列宽度显示为…&#xff0c;并且有tooltip提示&#xff0c;但是内容过多时&#xff0c;提示会超出屏幕&#xff1a; 但是el-table组件…

Vue 3.0中Treeshaking特性(详细解析)

文章目录 一、是什么二、如何做Vue2 项目Vue3 项目 三、作用参考文献 一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除…

逆向 jsvmp 之_signature实例

预备:a.v_jstools 插件,用来解析混淆 b.浏览器启动本地替换 c.nodejs 用来快速调试js 准备好后开搞: 1.首先找到 jsvmp入口点 2.用v_jstools解析混淆,再次刷新,进入入口,找到循环点 3.打日志,分析代码功能

察势而动,破界争先!COSP深圳户外电源展2024重磅开幕!

随着国内疫情逐渐消退&#xff0c;中央政府积极出台了一系列恢复民生的政策。其中&#xff0c;“地摊经济”的火爆&#xff0c;成为了人们茶余饭后的热门话题。这个政策的出台&#xff0c;不仅推动了地摊经济的发展&#xff0c;也让户外电源市场迎来了新的机遇。 随着户外电源产…

Git标签推送

标签默认属于本地分支&#xff0c;推送分支的时候并不会上传。需要自己手动推送 通过命令 git push origin <tagname>推送指定的标签 通过命令git push origin --tags批量推送所有的标签 在VS里打开git命令行窗口的方法&#xff1a;Git更改-操作-打开命令行提示符 对于…

【java】常见的面试问题

目录 一、异常 1、 throw 和 throws 的区别&#xff1f; 2、 final、finally、finalize 有什么区别&#xff1f; 3、try-catch-finally 中哪个部分可以省略&#xff1f; 4、try-catch-finally 中&#xff0c;如果 catch 中 return 了&#xff0c;finally 还会执行吗&#…

【C++】入门

结束数据结构初阶的学习后&#xff0c;很高兴继续学习C&#xff0c;欢迎大家一起交流~ 目录 C关键字 命名空间 命名空间定义 命名空间使用 C输入&输出 缺省参数 缺省参数概念 缺省参数分类 函数重载 函数重载概念 C支持函数重载的原理--名字修饰 引用 引用概念…

MacOS平台翻译OCR软件,双管齐下,还可自定义插件,为其添砖加瓦!

小编昨天为大家分享了Windows系统下的一款功能强大且免费的 OCR 开源工具 Umi-OCR。 今天则为大家推荐一款 MacOS系统下的一款 翻译 OCR 多功能双管齐下的桌面应用软件 Bob。这款软件虽然也上线了GitHub&#xff0c;但它不是一款开源软件&#xff0c;仓库只是作者为了用户反馈…

线程池调优,深入理解,线程池各个参数的含义(keepAliveTime 展开说说?)

线程池调优&#xff0c;深入理解&#xff0c;线程池各个参数的含义&#xff08;keepAliveTime 展开说说&#xff1f;&#xff09;目录 线程池核心组件核心线程、最大线程、阻塞队列的关系&#xff08;重点&#xff09;线程池调优&#xff08;运行流程&#xff09;keepAliveTime…

C++ 利用容器适配器,仿函数实现栈,队列,优先级队列(堆),反向迭代器,deque的介绍与底层

C 利用容器适配器,仿函数实现栈,队列,优先级队列【堆】,反向迭代器,deque的介绍与底层 一.容器适配器的介绍二.利用容器适配器实现栈和队列1.stack2.queue 三.仿函数介绍1.什么是仿函数2.仿函数的使用3.函数指针的使用1.函数指针的用处2.利用函数指针完成回调3.利用仿函数完成回…

CSS之粘性定位

让我为大家介绍一下粘性定位吧&#xff01; 大家应该都了解过绝对定位&#xff0c;它是相对于父级定位 那么粘性定位相对于谁呢&#xff1f; 它相对于overflow:hidden; 如果没找到就会跟fixed固定定位一样&#xff0c;相对于视口 <!DOCTYPE html> <html lang"en…

实习日志5

活字格图片上传功能&#xff08;批量&#xff09; 这个报错真的恶心&#xff0c;又看不了他服务器源码&#xff0c;接口文档又是错的 活字格V9获取图片失败bug&#xff0c;报错404-CSDN博客 代码BUG记录&#xff1a; 问题&#xff1a;上传多个文件的base64编码被最后一个文…

76 C++对象模型探索。多重继承中虚函数表分析

多重继承非重点内容&#xff0c;在实际开发中使用的不多&#xff0c; 这里只是为了知识点的完整&#xff0c;记录一下。 直接上结论。 一个类&#xff0c;如果继承于多个基类&#xff0c;且这个多个基类中有虚函数&#xff0c;那么 这个类 会有多个 虚函数表。 这个 类的对…

THM学习笔记——john

John the Ripper是目前最好的哈希破解工具之一。 John基本语法&#xff1a; john [options] [path to file] john&#xff1a;调用John the Ripper程序。 [path to file]&#xff1a;包含你要尝试破解的哈希的文件&#xff0c;如果它们在同一个目录中&#xff0c;你就不需要命名…

Docker容器基本管理

目录 一、概述 &#xff08;一&#xff09;为什么要用到容器 &#xff08;二&#xff09;docker概念 1.镜像 2.容器 3.仓库 &#xff08;三&#xff09;Docker与虚拟机的区别 &#xff08;四&#xff09;Linux namespace的六大类型 二、安装docker容器引擎 &#xff…

光耦驱动继电器电路图大全

光耦驱动继电器电路图&#xff08;一&#xff09; 注&#xff1a; 1U1-1脚可接12V&#xff0c;也可接5V&#xff0c;1U1导通&#xff0c;1Q1导通&#xff0c;1Q1-30V&#xff0c;线圈两端电压为11.7V. 1U1-1脚不接或接地&#xff0c;1U1不通&#xff0c;1Q1截止&#xff0c;1…

Federated Optimization in Heterogeneous Networks —— Fedprox算法

Federated Optimization in Heterogeneous Networks 1. 论文信息 论文题目: Federated Optimization in Heterogeneous Networks Fedprox算法&#xff0c;plato小项目跑通并理解作者&#xff1a;Tian Li, Anit Kumar Sahu, Manzil Zaheer, Maziar Sanjabi, Ameet Talwalkar, …

使用阿里云的oss对象存储服务实现图片上传(前端vue后端java详解)

一&#xff1a;前期准备&#xff1a; 1.1&#xff1a;注册阿里云账号&#xff0c;开启对象存储oss功能&#xff0c;创建一个bucket&#xff08;百度教程多的是&#xff0c;跟着创建一个就行&#xff0c;创建时注意存储类型是标准存储&#xff0c;读写权限是公共读&#xff09;…

HNU-编译原理-甘晴void学习感悟

前言 熬过煎熬的考试周、复习以及更加煎熬的等成绩&#xff0c;查到成绩的那一刻&#xff0c;心里还是挺开心的。 虽然我没有完全学懂这门课程&#xff0c;但我还是兢兢业业地通过了课程的考试&#xff0c;拿到了这门课程的认可。 记录一下自己对编译原理的学习感悟&#xf…