Prism学习笔记-模块之间通信的几种方式
在开发大型复杂系统时,我们通常会按功能将系统分成很多模块,这样模块就可以独立的并行开发、测试、部署、修改。使用Prism框架设计表现层时,我们也会遵循这个原则,按功能相关性将界面划分为多个模块,每个模块又包含多个Region。这就需要解决模块之间、Region之间经常需要进行通信的问题,Prism提供了以下几种方式:
1、聚合事件(Event aggregation)
使用方式,先在一个公共模块中定义一个事件MyEvent ,传输数据为MyEntity。
public class MyEvent : CompositePresentationEvent<MyEntity>
{
}
然后在需要等待处理事件的模块中订阅事件,如下所示:
private IEventAggregator eventAggregator;
eventAggregator = (IEventAggregator)ServiceLocator.Current.GetService(typeof(IEventAggregator));
eventAggregator.GetEvent<MyEvent>().Subscribe(MyEventHandler, true);
public void MyEventHandler(MyEntity myEntity)
{
}
eventAggregator 相当于一个全局的集合,保存了所有订阅的事件。
在发起通信的模块中发布事件,如下所示:
eventAggregator.GetEvent<CreatePlanEvent>().Publish(new MyEntity());
2、全局命令
使用方式,在公共模块中定义一个全局命令类:
public static class GlobalCommands
{
public static CompositeCommand OpenCommand = new CompositeCommand();
}
在使用该命令的View中:
<Button Command="{x:Static s:GlobalCommands.OpenCommand }" >
在响应该命令的模块中:
public ICommand OpenCommand { get; set; }
OpenCommand = new RelayCommand(param => this.Open(param));
GlobalCommands.OpenCommand.RegisterCommand(OpenCommand);
不用绑定时可以这样执行:
GlobalCommands.OpenCommand.Execute(param);
3、Region context
在Prism安装文件中自带的UIComposition例子中演示了两个Tab页共享一个数据集,
用法是在View中:
prism:RegionManager.RegionContext="{Binding CurrentEmployee}"
在两个Tab页的View的后台代码中:
RegionContext.GetObservableContext(this).PropertyChanged += (s, e)
=>
employeeDetailsViewModel.CurrentEmployee =
RegionContext.GetObservableContext(this).Value
as Employee;
我们还可以利用Region.Context属性共享数据,Region.Context中可以保存任何该Region需要与其他Region共享的数据。
因此我在实际使用时用Region.Context来保存一个控件对象的引用。如下所示:
在一个模块中保存
mainRegion.Context = new ContentControl();
在另一个模块中取出
IRegion mainRegion = regionManager.Regions["MainRegion"];
if (mainRegion == null) return;
ContentControlpane = mainRegion.Context as ContentControl;
因为regionManager是全局的,所以可以随时获得感兴趣的Region和Context
4、共享服务
这种方法我们在前面已经接触到了,如:
eventAggregator = (IEventAggregator)ServiceLocator.Current.GetService(typeof(IEventAggregator));
还可以,container= (IEventAggregator)ServiceLocator.Current.GetService(typeof(IUnityContainer));
IEventAggregator和IUnityContainer是Prism已有的服务,我们还可以自定义服务,请参考Prism自带的StockTrader RI例子
中的IMarketHistoryService服务。
Prism学习笔记-模块之间通信的几种方式的更多相关文章
- IPC进程之间通信的几种方式
概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是 ...
- Android Service与Activity之间通信的几种方式
在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ ...
- Vue组件之间通信的三种方式
最近在看梁颠编著的<Vue.js实战>一书,感觉颇有收获,特此记录一些比价实用的技巧. 组件是MVVM框架的核心设计思想,将各功能点组件化更利于我们在项目中复用,这类似于我们服务端面向对象 ...
- vue组件之间通信的8种方式
对于vue来说,组件之间的消息传递是非常重要的,下面是我对组件之间消息传递的常用方式的总结. props和$emit(常用) $attrs和$listeners 中央事件总线(非父子组件间通信) v- ...
- Liferay7 BPM门户开发之33: Portlet之间通信的3种方式(session、IPC Render Parameter、IPC Event、Cookies)
文章介绍了5种方式,4种是比较常用的: Portlet session IPC Public Render Parameters IPC Event Cookies 参考地址: https://web ...
- Angular 学习笔记——模块之间的通讯
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- Linux学习笔记21——线程同步的两种方式
一 用信号量同步 1 信号量函数的名字都以sem_开头,线程中使用的基本信号量函数有4个 2 创建信号量 #include<semaphore.h> int sem_init(sem_t ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- struts2学习笔记--总结获取servletAPI的几种方式
struts2的Action放弃了request,response等ServletAPI,使得在业务层上更加独立,在有时候使用struts2进行Web开发的时候,不可避免的要在action中使用ser ...
随机推荐
- 01-spring框架——spring概述
Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的.Spring 的核心是控制反转(IoC)和面向切面编程(AOP).Spring 是可以 ...
- ftp上传下载功能实现
该程序分为客户端和服务端,目前已经实现以下功能: 1. 多用户同时登陆 2. 用户登陆,加密认证 3. 上传/下载文件,保证文件一致性 4. 传输过程中现实进度条 5. 不同用户家目录不同,且只能访问 ...
- tensorflow以文件形式运行程序实例
在命令行中进入到代码所在文件夹 执行python mnist2.p或python aaa/mnist2.py这种形式
- 提升Java开发效率必看!教你如何在MyEclipse中使用内联搜索
MyEclipse CI 2019.4.0安装包下载 Inline Search取代传统Eclipse查找和替换对话框,提供更搞笑.更具侵略性的搜索体验——一种不会中断开发工作流程的工具. DevSt ...
- 【leetcode】740. Delete and Earn
题目如下: Given an array nums of integers, you can perform operations on the array. In each operation, y ...
- Swagger使用--在一个Controller中使用相同(类似)参数的方法
解决方法:在Startup.cs中加入CustomSchemaIds // Register the Swagger generator, defining 1 or more Swagger doc ...
- linux运维、架构之路-Kubernetes基础(一)
一.Kubernetes介绍 Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统.Kubernetes的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并 ...
- k8s-强制删除pod
kubectl get deployments --all-namespaces [root@master ~]# kubectl get deployments --all-namespacesNA ...
- 21. ClustrixDB 识别平台限制
本节描述集群性能上潜在的限制平台因素,如何度量集群是否接近或超过这些限制,以及纠正这些条件的可用选项.“平台因素”指的是硬件资源,如CPU.内存.磁盘和网络I/O子系统.有关潜在的软件相关因素,请参见 ...
- node 的fs.state 获取文件信息
1. fs.stat()可以获取文件的信息,用法如下: const fs = require('fs'); fs.stat('./book.js',(err,stats)=>{ if(err) ...