如何避免Prism模块中EventAggregator事件被多次调用?
问题
订阅在EventAggregator上的事件被多次调用。
public class ModuleViewModel { public ModuleViewModel(IEventAggregator eventAggregator) { eventAggregator.GetEvent<ModuleEvent>().Subscribe(OnEventReceived); } private void OnEventReceived(ModuleEvent event) { } }
原因
Prism模块的ViewModel构造函数内订阅了事件,而主应用包含多个视图,每个视图都有一个Region,且这些视图均使用同一模块,导致模块被多次初始化。
触发条件
- 主应用的App类从目录加载模块:
public partial class App : PrismApplication { protected override IModuleCatalog CreateModuleCatalog() { string modulePath = @".\Modules"; if (Directory.Exists(modulePath) == false) { Directory.CreateDirectory(modulePath); } var catalog = new DirectoryModuleCatalog() { ModulePath = modulePath}; foreach(var module in catalog.Modules) { module.InitializationMode = InitializationMode.WhenAvailable; } return catalog; } // ... }
- 主应用的每个视图都包含Region:
public class Module : IModule { // ... public void OnInitialized(IContainerProvider containerProvider) { var regionManager = containerProvider.Resolve<IRegionManager>(); regionManager.RegisterViewWithRegion("Region1", typeof(ModuleView)); regionManager.RegisterViewWithRegion("Region2", typeof(ModuleView)); } public void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation<ModuleView, ModuleViewViewModel>(); } }
- 模块无数据:模块显示时,主应用通过事件发送配置;模块运行时,主应用也会通过事件发送配置。
- 同一时间仅显示主应用的一个视图
编辑:原描述不够清晰,已更新内容。
内容的提问来源于stack exchange,提问作者Bap
相关产品推荐
相关产品推荐

