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