Prism是一个强大的Mvvm框架,下面我们将重点讲解如何在项目使用Prism提供的基础功能,完成基于MVVM的WPF项目的框架设计和开发,包括应用程序的架构。

项目的解决方案结构,项目采用Prism作为UI框架,NHiberia+Unity作为ORM和IOC框架。

下面我们就来一步步解析项目中的每个部分的细节和最终项目如何把这些细节组织起来的做一个整体结构上的说明。关于其他的分层设计结构我就不多说了,只关注Prism部分的内容。

1、关于对Prism的基础封装

为什么不直接使用Prism,我们希望开发人员的学习成本更低,所以,我们队Prism的一些方法进行了封装,更符合开发人员之前熟悉的MVVM模式。

关于封装的具体内容,我们后续会看到代码。

2、关于Infrastructure基础设施层定义

3、具体的模块定义

4、看看程序应用宿主的定义:

通过上面,我们介绍了基础的项目和具体的模块和宿主模块的定义,下面我们就来详细的分析下Prism如何加载模块的并且模块间如何通信,如何完成业务功能的完整流程:

在之前介绍HelloWorld的时候,我们有简单的介绍了Prism的基本流程是宿主会在Bootstrappter中对模块进行装载并初始化,下面我们来看看我们在我给出的例子中的具体过程。

a、Shell的定义:

与之前的区别就是在于,我们原来是手写的字符串,这里通过单独的类定义成静态的常量成员,我们能够防止名称出错的可能。同时我们也可以避免因为某处界面上Region符号的变化,因为某处没有修改,而造成不同步,运行出错的情况的发生,更容易统一的管理。具体的基础设施层中关于RegionType的定义如下:

接着查看Shell的后台cs代码:

1 ///

2 ///MainWindow.xaml 的交互逻辑3 ///

4 [Export]5 public partial classShell : Window6 {7 publicShell()8 {9 InitializeComponent();10 }11

12 ///

13 ///设置ViewModel14 ///

15 ///

16 ///This set-only property is annotated with theso it is injected by MEF with17 ///the appropriate view model.18 ///

19 [Import]20 [SuppressMessage("Microsoft.Design", "CA1044:PropertiesShouldNotBeWriteOnly", Justification = "Needs to be a property to be composed by MEF")]21 ShellViewModel ViewModel22 {23 set

24 {25 this.DataContext =value;26 if (this.DataContext != null)27 {28 ((ShellViewModel)this.DataContext).OnStatusChanged += new Action(SystemStatusManagementEventHandler);29 }30 }31 }32

33 public void SystemStatusManagementEventHandler(stringparameter)34 {35 if(parameter.IsNullOrEmpty())36 {37 throw new ArgumentNullException("无法完成操作");38 }39

40 switch(parameter)41 {42 caseHM_EMSTS.WorkStation.Infrastructure.MenuParams.Max:43 this.WindowState =System.Windows.WindowState.Maximized;44 break;45 caseHM_EMSTS.WorkStation.Infrastructure.MenuParams.Min:46 this.WindowState =System.Windows.WindowState.Minimized;47 break;48 caseHM_EMSTS.WorkStation.Infrastructure.MenuParams.Close:49 if (MessageBox.Show("是否退出系统?", "退出系统?", MessageBoxButton.OKCancel, MessageBoxImage.Question) ==MessageBoxResult.OK)50 {51 this.Close();52 }53 break;54 }55 }56 }

上面的代码中采用了MEF中的Export特性和Import特性。 关于MEF的内容,我这里就不多介绍了,不是很了解的可以谷歌或百度下。

继续,我们查看Shell的ViewModel定义,因为上面的后台的cs代码中有订阅相关的事件。

1 [Export(typeof(ShellViewModel))]2 public classShellViewModel : HM_EMSTS.WorkStation.UICommon.NotifyBaseObject3 {4 public ActionOnStatusChanged;5

6 [ImportingConstructor]7 publicShellViewModel(IEventAggregator eventAggregator)8 {9 //注册事件

10 if (eventAggregator == null)11 {12 throw new ArgumentNullException("eventAggregator");13 }14

15 eventAggregator.GetEvent().Subscribe(this.SystemStatusManagementEventHandler);16 }17

18 public void SystemStatusManagementEventHandler(stringparameter)19 {20 if(parameter.IsNullOrEmpty())21 {22 throw new ArgumentNullException("无法完成操作");23 }24

25 if (OnStatusChanged != null)26 OnStatusChanged(parameter);27 }28 }

上面的代码,主要是为了完成对事件的订阅,并且当收到订阅的事件时,通知出去。这里特别注意,可以参考下图:

关于Event的定义我们可以看看上述Event的定义:

如果想按照,我们之前写的那样的形式来绑定和触发事件操作的话,必须这么写。

那么下面我们来看看ShellModule的定义吧,我们这里的代码如下:

我们使用了某个Module项目中的页面来替换shell中的Region。这样保证了Shell运行起来后能够正确的显示界面。

下面来看看项目中最重要的WorkStationBootstrapper的定义

前面介绍的helloWorld里面是采用的Unity容器,这里是MEF,所以要注意的部分,有所不同。这里需要制定MEF可导入导出部件所在的目录或程序集

我们知道shell后台cs的代码定义前面也说过了,有带有export标记。那么当执行上述的代码后,将会出现在MEFbootstrappter的Container中。这里的container是CompositionContainer是MEF中定义的。

接着查看如下方法:

通过上面的几个方法,此时,我们的主程序,就完成了对Region的解析,显示出来即可。

B、模块定义:

Module主要是为了,替换Region符合和标记为具体的界面而是用的。

我们下面挑选一个页面来展示完整的定义和操作。

1、Model定义:

当我们的Model具有自动通知机制时,特别对于列表中的某个单元格的属性发生改变后,不需要刷新整个列表,这时候就会自动完成更新,WPF会自动完成。

2、IView接口定义。

因为我们这里采用MVP的设计模式,所以要求所有的View必须继承自IView接口。

我们这里都是直接定义View对应的唯一接口即可,主要是为了MEF的Export和Import时有用。

3、View的定义。

设计视图:

后台代码:

4、ViewModel的定义。

这里由于我们采用MVP模式,所有对于不同View之间的交互,我们这里放到了Presenter中,ViewModel充当的是对IView界面的完全控制抽象。

所以我们看到这里,没有任何的业务代码。但是对已IView界面所有的绑定信息,都需要定义到该类中。

5、Presenter定义。

上面讲Presenter标记了Export。主要是在Module中对Region进行映射时使用。

然后我们来看看PresenterBase的定义,一看便明白

这样在构造展示器时,我们便可以将IView和ViewModel之间的关系完成绑定。

6、Module的定义

这样我们就完成了,一个模块的功能开发,该功能模块尽量功能独立。

最终,我们通过一个主界面,将这样功能模块组装起来即可。

prism项目搭建 wpf_WPF Step By Step 系列-Prism框架在项目中使用相关推荐

  1. prism项目搭建 wpf_新WPF项目的Prism和MVVM

    这里有几个问题,所以我会尽我最大的努力把它们都包括进去. 我在一个项目中工作,这个项目在其他框架的旁边有wpf.mvvvm和prism.最好的建议是在把它们粘在一起之前,先了解它们的力量和功能.在这种 ...

  2. Re:从零开始的Vue项目搭建

    Re:从零开始的Vue项目搭建 初始的终结与结束的开始 Nodejs项目的简单测试 从零开始 webpack开发模式 webpack编译打包 后记 初始的终结与结束的开始 最开始接触vue项目搭建是从 ...

  3. Struts2项目搭建

    老规矩,首先对Struts2的背景信息做简单介绍,这里不过多解释MVC设计模式是如何如何的,Struts2是MVC中Controller角色的一个较好实现,它包含了请求的处理.数据的验证.数据模型绑定 ...

  4. Spring mvc+ maven + MyBatis + Oracle + IDEA 项目搭建 - framework 进阶中(一)

    原文链接 http://blog.csdn.net/qq184377902/article/details/51493642 结合自身情况加以修改搭建的框架,记录以防备忘,方便日后学习参考. Befo ...

  5. 核心项目:高并发秒杀系统(项目介绍,项目搭建,数据库,DAO)

    1,项目介绍 1.1,问题难点 在原SSH基础上,替换为SpringBoot系统,模拟了高并发场景的商城系统,它具备秒杀功能,并在经过几个版本的迭代之后成为支持高并发的高性能系统.这种秒杀活动会让用户 ...

  6. 001-云E办_后端项目搭建

    001-云E办_后端项目介绍 一.项目介绍: 二.项目搭建 1.创建数据库 2.创建父项目 3.创建子项目:yeb-server 4.更改yeb-server 1.在xml文件中,添加依赖于父工程. ...

  7. 魔方APP项目-01-移动端开发相关概念、移动端自适配、元信息(meta)、开发准备、移动端项目搭建(模拟器调试)、APICloud(APICloud 前端框架,获取服务端API接口)

    一.移动端开发相关概念 1.APP类型 ①.Native APP Native APP又称原生APP,就是我们平时说的手机应用软件. 原生APP 是针对IOS.Android.Windows等不同的手 ...

  8. 自动化测试---移动端自动化测试项目搭建(Appium+IDEA)

    自动化测试---移动端自动化测试项目搭建(Appium+IDEA) 模拟器+Appium操作 IDEA项目搭建 模拟器+Appium操作 首先打开黑窗口 输入命令 注:具体命令可看上一篇博客 第一步从 ...

  9. VUE 2.0 项目搭建流程

    1.首先按照nodejs.官网:https://nodejs.org/zh-cn/download/ 2.nodejs安装完成后,安装vue-cli.npm i -g @vue/cli      检查 ...

最新文章

  1. VC Studio 使用技巧大全(转)
  2. android图库文件夹乱,防止文件夹包含在Android图库中 | MOS86
  3. 学计算机数据结构重要吗,程序员都说数据结构重要,那么究竟什么是数据结构?...
  4. 链接二叉树中同一层的节点
  5. WCF系列教程之WCF客户端调用服务
  6. angular 加入原生html,Angular HTML绑定
  7. WSDL4J解析WSDL文件方法
  8. Flask 正则路由匹配——转换器
  9. go 正则表达式分组匹配_Python正则表达式的7个使用典范(推荐)
  10. 零基础小白学Java 基础语法
  11. MATLAB实现的Reed-Muller(RM码,里德-马勒编码)编码解码纠错以及BER分析
  12. 多线程_并发_同步_快乐影院
  13. 使用阿里云Ubuntu搭建代理服务器
  14. 绘图用计算机软件的基本种类有,主编教您电脑绘图软件有哪些
  15. python卡方拟合性检验_卡方分布、卡方独立性检验和拟合性检验理论及其python实现...
  16. 苹果系列产品如何保修-Apple官方回复
  17. 多模态生物特征识别 基于人脸与人耳信息pdf
  18. 计算机和运筹学就业方向,运筹学与控制论专业就业方向
  19. Bootstrap5 弹出框
  20. 程序员初创公司的合伙人股权的进入和退出机制设计-20151020

热门文章

  1. sim卡移动端漏洞解析
  2. linux Centos6.5使用yum安装mysql
  3. VC++实现恢复SSDT
  4. Python学习之字符串
  5. 关于对cpu的理解和kvm虚拟机到物理cpu的绑定
  6. linux svn可视化,Ubuntu 14.04如何安装可视化SVN
  7. python查看函数调用栈
  8. java刚工作搭建环境_Java开发环境的搭建
  9. Java从SFTP服务器下载文件一
  10. djanjo 使用a标签跳转_django页面跳转怎么写