在开发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肯定是经过一番详细考虑的,...