在开发WPF或是Silverlight应用程序的过程中,Prism是一种非常好的框架,今天和大家一起学习Prism中的Event Aggregator,应该机制组织一个全局事件,在应用程序任何地方,只要Subscribe事件,再Publish事件,即可完成.NET事件的“全局管理”.
以下是相关注意点:
1 要有一个Container有两种方法后成,一种是直接导入
public IUnityContainer Container; //{ get; set; }
[ImportingConstructor]
public Shell(IUnityContainer Container)
2 得到ViewModel的时候,得到Container:
public MainViewmodel viewModel; //{ get; set; }
[ImportingConstructor]
public Shell(MainViewModel viewmodel)
在MainViewModel中得到Container.
3 用Resolve方法出来的View, 默认的构造方法不会执行,所以应该:
public RightView(RightViewModel vm)
InitializeComponent();
viewModel = vm;
// 在View中设值的时候,就初始化订阅事件
viewModel.View = this;
4 正常情况下,应该通过在Module中用RegionManager把view注入到Shell中的。不知道为什么RegionManager加入没有用?
Module A:
public void Initialize()
//var view = Container.Resolve<LeftView>();
//RegionManager.Regions["LeftRegion"].Add(view);
shell:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ItemsControl cal:RegionManager.RegionName="LeftRegion" Grid.Column="0" />
<ItemsControl cal:RegionManager.RegionName="RightRegion" Grid.Column="1" />
</Grid>
但是本例用了直接的方法:在Shell后台直接加上了:
public IUnityContainer Container; //{ get; set; }
[ImportingConstructor]
public Shell(IUnityContainer Container)
InitializeComponent();
this.Container = Container;
var view = this.Container.Resolve<LeftView>();
panel.Children.Add(view);
var view2 = this.Container.Resolve<RightView>();
var view3 = this.Container.Resolve<RightView>();
view2.SubscribeEvents();
view3.SubscribeEvents();
panel.Children.Add(view2);
panel.Children.Add(view3);
5 Module A中的事件通过,在设置View和后台的ViewPresenter联结的时候,就在ViewPresenter中进行了注册:
[ImportingConstructor]
public LeftView(SelectViewModel viewModel)
InitializeComponent();
this.AddButton.Click += AddCustomer;
this.viewModel = viewModel;
// 在View中设值的时候,就初始化订阅事件
viewModel.View = this;
ViewPresenter:
private ISelectView _view;
/// <summary>
/// 在View中设值的时候,就初始化订阅事件
/// </summary>
public ISelectView View
get{return _view ;}
set {
_view = value;
View.ButtonClick += new EventHandler(View_ButtonClick);
6 发布Event Aggregator事件:
void View_ButtonClick(object sender, EventArgs e)
Customer customer = new Customer() { CustomerId = View.CustomerId };
if (!string.IsNullOrEmpty(customer.CustomerId))
this.eventAggregator.GetEvent<CustomerAddedEvent>().Publish(customer);
注册事件:
public void Subscribe()
this.eventAggregator.GetEvent<CustomerAddedEvent>().Subscribe(OnSubscribeEvent);
Demo下载地址:https://skydrive.live.com/#cid=6B286CBEF1610557&id=6B286CBEF1610557!683
转载于:https://www.cnblogs.com/shanghaijimzhou/archive/2013/03/31/2991550.html
在开发WPF或是Silverlight应用程序的过程中,Prism是一种非常好的框架,今天和大家一起学习Prism中的Event Aggregator,应该机制组织一个全局事件,在应用程序任何地方,只要Subscribe事件,再Publish事件,即可完成.NET事件的“全局管理”.以下是相关注意点:1 要有一个Container有两种方法后成,一种是直接导入 publ...
1. 事件聚合器
Prism 提供了一种机制,可以实现应用程序中松散耦合组件之间的通信。这种机制基于事件聚合器服务,允许发布者和订阅者通过事件进行通信,并且彼此之间仍然没有直接引用。
事件聚合器提供多播发布/订阅功能。这意味着可以有多个发布者引发相同的事件,并且可以有多个订阅者监听相同的事件。
通过事件聚合器服务可以使用IEventAggregator接口获取到事件聚合器。事件聚.
一、EventAggregator简介
EventAggregator是Prism中专门处理ViewModel与ViewModel之间事件传递的类对象,它提供了针对事件的发布方法和订阅方法,所以可以非常方便的来管理事件。下面的图就是其实现的一个比较简便的说明:
二、EventAggregator单页传递数据
首先,新建一个WPF项目,然后安装好Prism,这里我们可以通过程序包管理...
1 根据《prism 搭建项目》搭建Prism项目
2 新建类库项目Prism.UseEventAggregator,创建MessageSentEvent类,使其继承于PubSubEvent<string>
using Prism.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namesp
Prism的Event Aggregator模式:Event Aggregator允许多对象定位和发布、订阅事件。
我们从Prism源代码中的EventAggregator和CompositePresentationEvent可以学习它是如何管理和传递事件消息的。
我最近打算学习WPF ,在寻找MVVM框架的时候发现了PRISM,在此之前还从一些博客上了解了其它的MVVM框架,比如浅谈WPF中的MVVM框架--MVVMFoundation 中提到的MVVMFoundation,再比如 ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet 中的Stylet。在知道PRISM是微软自家的框架的时候,就毫不犹豫的选了它,即便个人很倾向于可爱的Style。作为初学者,对WPF都没有很好的了解的情况下,去学习使用一个WPF的框架是否真的大丈夫?好在我发现了这个Prism-Samples-Wpf,既是WPF的应用,也可作为学习WPF的示例。
Prism框架的设计目的是用来帮助构建丰富、灵活、易维护的WPF和Silverlight应用程序。
Modules:Modules是能够独立开发、测试、部署的功能单元,Modules可以被设计成实现特定业务逻辑的模块(如Profile Management),也可以被设计成实现通用基础设施或服务的模块(如Logging、Exception Management)。
Module C
propp-属性,具有依赖于BindableBase的后备字段
cmd-使用Execute方法创建DelegateCommand属性
cmdfull-使用Execute和CanExecute方法创建DelegateCommand属性
cmdg-创建通用的DelegateCommand属性
cmdgfull...
prism使用依赖注入的方式获取IEventAggregator,以此来获取继承自CompositePresentationEvent的事件。
使用Import导入IEventAggregator
[Import]
protected IEventAggregator _eventAggregator = null;
实例化EventAggregator()
public IEventAggregator eventAggregator;
eventAggregator = new Event
在开发Silverlight程序的时候,经常需要在不同的组件间进行通信。比如点击一个button,可能就需要改变另一个控件的内容。比较直接的办法是使用事件,当然使用MVVM的时候也可以使用command,还可以定义一些全局的变量来保存一些信息等。
Prism提供了几种用于组件间通信的途径,可以使用RegionContext使不同的视图共享数据,也可以借助于容器的力量来使用共享的service...
接[从Prism中学习设计模式之Event Aggregator模式]一文,上文中从源码的角度分析了Prism中EventAggregator的实现。
Lz想通过本文再深入谈下EventAggregator,将自己对Prism项目组的设计意图的理解做下记录,并希望和其他对Prism有兴趣的兄弟一起探讨。
对于Prism的设计团队来说,设计EventAggregator肯定是经过一番详细考虑的,...