【问题标题】:Using the IEventAggregator, is it possible to first Publish an event and then Subscribe to it?使用 IEventAggregator,是否可以先发布事件然后订阅它?
【发布时间】:2017-09-04 12:29:53
【问题描述】:

也许我实现这个的方法是错误的,但我在这里:

我目前正在使用 MVVM 和 Prism 开发一个应用,带有登录对话框和多个模块:

  1. MainWindowViewModel 订阅一个事件:_ea.GetEvent<RegisterMenuItemEvent>().Subscribe(AddMenuItem, true); 检查是否必须将模块名称添加到列表视图;
  2. 在启动时,它会从一个文件夹中动态加载所有模块:
    • 每个 IModule 类都侦听一个 LoginEvent:_ea.GetEvent<LoginEvent>().Subscribe(CheckRoles, true);,用于检查用户是否有权导航到模块视图;
    • 如果符合要求,则使用CheckRoles() 方法发布一个将模块注册为列表视图项的事件:_ea.GetEvent<RegisterMenuItemEvent>().Publish(new MenuItem(null, View, ModuleName, GroupName));
  3. 登录后
    • 它根据您为每个模块指定的角色将模块注册为列表视图菜单项:_ea.GetEvent<LoginEvent>().Publish(new LoginInfo(ctxUser.Username, ctx.UserRole.Where(r => r.UserId == ctxUser.Id).Select(r => r.Role.Name).ToList()));
    • 将经过身份验证的用户名设置为MainWindowView

以上所有内容都按照确切的顺序执行。

我的问题是,如何订阅已经发布的活动?:

  • 这已在 MainWindowViewModel _ea.GetEvent<MessageEvent>().Publish("Username"); 中执行
  • 这是在 _ea.GetEvent<MessageEvent>().Subscribe(GetUsername); 模块的 ViewModel 中执行的,但它不起作用。

【问题讨论】:

  • 您需要在发布之前订阅
  • @mm8 所以,我想这是强制性的。
  • 是的,如果您想确保不错过任何活动,您应该确保在其他人发布相同活动之前订阅。看我的回答。

标签: wpf mvvm prism


【解决方案1】:

我的问题是,如何订阅已经发布的活动?

你不能。好吧,您确实可以订阅该活动,但如果您明白我的意思,您将不会收到任何已发布的活动。

因此,如果您想确保不会错过任何事件,则需要确保在任何其他组件发布事件之前订阅该事件。

【讨论】:

  • 好的。谢谢大家的回答。我会尝试修改我的代码,以便它首先订阅。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2012-06-24
  • 2021-10-04
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多