Prism 框架 -含ViewModelLocator
本文主要做Prism框架当中的指定视图绑定的上下文ViewModel,做如下方式
- 注册视图时指定命名空间
- 使用ViewModelLocator 自动查找或是自定义搜索方式
- 指定控件容器的DataContext、或是指定控件的ViewModel
注册视图时指定命名空间
基础不过多介绍! 在将App类继承于 Prism.DryIoc中的PrismApplication后 程序当中我们必须重写的两个抽象方法附上 PrismApplication 的父类中PrismApplicationBase 中的两个抽象方法 图1-1示例图(抽象方法必须由子类重写 抽象成员不具有方法体、只能在抽象方法中具有抽象成员等多种特性关于抽象的解释可用看我之前写的文章含抽象修饰词的解释)
图1-1内部方法截图
代码示例:
using Prism.DryIoc;
using Prism.Ioc;
using System.Windows;
using WpfApp5.ViewModel;
namespace WpfApp5
{public partial class App : PrismApplication{protected override Window CreateShell()=> Container.Resolve<MainWindow>();protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterForNavigation<MainWindow, MainWindowVM>();//指定MainWindow的DataContext 是MainWindowVM containerRegistry.RegisterForNavigation<UserControl1>();//这种写法是没有指定}}
}
示例解释:
在重写的方法RegisterTypes中IContainerRegistry 类型参数 通过变量containerRegistry 的属性RegisterForNavigation注册窗体的同时指定窗体对应的VIewModel
使用ViewModelLocator 自动查找
代码示例:
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
示例解释:
在前端引用Prism位置给prism,prism:ViewModelLocator.AutoWireViewModel="True"是指定窗体时自动查找ViewModel,查找方式必须是 ViewModel文件夹中的:视图名称+ViewModel
自定义ViewModelLocator搜索方式
代码示例:
using Prism.DryIoc;
using Prism.Ioc;
using Prism.Mvvm;
using System;
using System.Windows;
using WpfApp5.ViewModel;
namespace WpfApp5
{public partial class App : PrismApplication{protected override Window CreateShell() => Container.Resolve<MainWindow>();protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterForNavigation<MainWindow,MainWindowVM>();containerRegistry.RegisterForNavigation<UserControl1>();}protected override void ConfigureViewModelLocator(){ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>{var viewName = viewType.Name;var viewModelNameSpace = $"WpfApp5.ViewModel";//名称控件位置var viewModelName = $"{viewModelNameSpace}.{viewName}VM";//ViewModel的位置 全名称空间//如不是同一个项目文件中,ViewModel是被分开在另一个项目文件中 那么需要将读取ViewModel项目文件下的dll//var assembly = Assembly.LoadFile(Path.Combine(Directory.GetCurrentDirectory(), "Paramecium.App.ViewModels.dll"));Type type = Type.GetType(viewModelName);return type;});}}
}
示例解释:
我们需要关注到的是类中重写的方法 ConfigureViewModelLocator 其中是通过改变它的查找方式来改变默认的查找方式。由原来的ViewModel文件夹中的:视图名称+ViewModel,改为视图名称+VM(原来查找的位置是在VIewModel下查找)
指定控件容器的DataContext
写法1
<Window x:Class="WpfApp5.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp5"mc:Ignorable="d"xmlns:prism="http://prismlibrary.com/"Title="MainWindow" Height="450" Width="800"><Grid><Grid.DataContext><UserControl/><!--指定Grid中的上下文是UserControl数据上下文--></Grid.DataContext><Grid.RowDefinitions><RowDefinition Height="1*" /><RowDefinition Height="1*" /></Grid.RowDefinitions><Button Click="button_Click" Grid.Row="0"/><ContentControl Grid.Row="1" prism:RegionManager.RegionName="ok" /></Grid>
</Window>
写法2
<Window x:Class="WpfApp5.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp5"mc:Ignorable="d"xmlns:prism="http://prismlibrary.com/"Title="MainWindow" Height="450" Width="800"><Grid DataContext="{Binding User}"> <Grid.RowDefinitions><RowDefinition Height="1*" /><RowDefinition Height="1*" /></Grid.RowDefinitions><Button Click="button_Click" Grid.Row="0"/><ContentControl Grid.Row="1" prism:RegionManager.RegionName="ok" /></Grid>
</Window>
namespace WpfApp5.ViewModel
{public class MainWindowVM{public UserControl1VM User { get; set; } = new UserControl1VM();}
}
指定控件的ViewModel
<Windowx:Class="WpfApp5.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:WpfApp5"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:prism="http://prismlibrary.com/"Title="MainWindow"Width="800"Height="450"mc:Ignorable="d"><Grid><Grid.RowDefinitions><RowDefinition Height="1*" /><RowDefinition Height="1*" /></Grid.RowDefinitions><ButtonGrid.Row="0"Click="button_Click"DataContext="{Binding User}" /><ContentControl Grid.Row="1" prism:RegionManager.RegionName="ok" /></Grid>
</Window>
Prism 框架 -含ViewModelLocator相关推荐
- WPF的Prism框架简介
什么是Prism Prism是一个用于在 WPF.Xamarin Form.Uno 平台和 WinUI 中构建松散耦合.可维护和可测试的 XAML 应用程序框架. Prism是一个用于在WPF.Xam ...
- WPF(七) Prism框架基本特性
参考文档: Prism 官方文档 Prism Library Prism GitHub 地址 GitHub - PrismLibrary/Prism 大佬博客 Prism合集 - 随笔分类 - 痕迹g ...
- WPF Prism框架
Prism框架 1.关于Prism框架 官方地址:http://prismlibrary.com 官方源码:https://github.com/PrismLibrary/Prism 版本 ...
- Prism框架实战——订餐软件
参考B站刘铁猛老师的订餐软件https://www.bilibili.com/video/av29782724?from=search&seid=6787438911056306128 环境: ...
- Prism框架初识-区域介绍
框架初识 首先,我们要添加Prism框架包 这个框架包里包含了区域,导航,会话服务,容器. 我使用的是vs2022 -解决方案-引用-管理NuGet程序包-搜索Prism.DryIoc,下载即可 然后 ...
- 【WPF】Prism框架基础
Prism框架: 初识: 我们创建一个基于net5.0的WPF应用程序 创建完之后在VS里面添加相关的包 修改app继承的基类 public partial class App : PrismAppl ...
- Prism框架研究(一)
从今天起开始写一个Prism框架的学习博客,今天是第一篇,所以从最基本的一些概念开始学习这个基于MVVM的框架的学习,首先看一下Prism代表什么,这里引用一下比较官方的英文解释来看一下:Prism ...
- Prism框架(一)——概述Prism框架的设计目的是用来帮助构建丰富、灵活、易维护的WPF和Si...
Si Prism框架(一)--概述Prism框架的设计目的是用来帮助构建丰富.灵活.易维护的WPF和Si 提问者:mfksnr120(ID:187460) | 悬赏 0.0 希赛币 | 回答数:0 | ...
- UWP应用程序使用Prism框架构建MVVM
在我们创建的UWP解决方案中选择引用->管理NuGet包程序包 NuGet管理包 2. 搜索Prism.Core,并安装 搜索Prism.Core 3. 搜索Prism.Unity,并安装 搜索 ...
最新文章
- 国内大陆芯片70个细分领域重要代表企业!
- 如何看exe文件源代码_杀进程、删文件...看新型勒索软件RobbinHood如何干掉杀毒软件...
- 【学术相关】人工智能顶会审稿现状—理想中的审稿人vs实际审稿人
- php之clone 复制对象以及__clone魔术方法
- yum配置文件 重启后还原_江湖救急 : CentOS7.5 /usr 目录误删, 恢复操作.
- 顺丰拟发行58亿可转债:15亿投入航空运力,12亿还贷款
- ubuntu 安装 mono报错 E: Unable to correct problems, you have held broken packages.
- 新手如何发布第一个Python项目开源包?这里有一份详细指南
- SLAM 领域国内外优秀实验室/开源方案(汇总)
- 继续教育计算机组成原理a试卷,计算机组成原理试卷.docx
- Pascal基础(四)-常用函数和标准库
- 7、前后端分离中的权限管理思路
- 全息投影手机Alo将引领未来趋势!全息3d 网
- 期货反跟单-侃侃人工反跟单那些事儿
- 同余2:线性逆元和中国剩余定理的学习笔记
- 隐私泄露中的人性剖析
- Python解题 - NOIP2005 青蛙过河
- Espressif 玩转 PWM
- 市场调研报告-全球与中国2-氨基-5-碘吡啶市场现状及未来发展趋势
- NTC热敏电阻计算温度之C代码