第525篇-Prism学习系列1_Event Aggregator

在开发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

posted @ 2013-03-31 11:53  Shanghai Jim Zhou  阅读(680)  评论(0编辑  收藏  举报