【发布时间】:2017-09-04 12:29:53
【问题描述】:
也许我实现这个的方法是错误的,但我在这里:
我目前正在使用 MVVM 和 Prism 开发一个应用,带有登录对话框和多个模块:
-
MainWindowViewModel订阅一个事件:_ea.GetEvent<RegisterMenuItemEvent>().Subscribe(AddMenuItem, true);检查是否必须将模块名称添加到列表视图; - 在启动时,它会从一个文件夹中动态加载所有模块:
- 每个 IModule 类都侦听一个 LoginEvent:
_ea.GetEvent<LoginEvent>().Subscribe(CheckRoles, true);,用于检查用户是否有权导航到模块视图; - 如果符合要求,则使用
CheckRoles()方法发布一个将模块注册为列表视图项的事件:_ea.GetEvent<RegisterMenuItemEvent>().Publish(new MenuItem(null, View, ModuleName, GroupName));
- 每个 IModule 类都侦听一个 LoginEvent:
- 登录后
- 它根据您为每个模块指定的角色将模块注册为列表视图菜单项:
_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 所以,我想这是强制性的。
-
是的,如果您想确保不错过任何活动,您应该确保在其他人发布相同活动之前订阅。看我的回答。