0
也許我實現這是錯誤的,但在這裏,我出來的方法:使用IEventAggregator,是否有可能首先發佈一個事件,然後訂閱它?
我目前正在開發使用MVVM和棱鏡應用,而在登錄對話框和多個模塊:
- 的
MainWindowViewModel
訂閱了一個事件:_ea.GetEvent<RegisterMenuItemEvent>().Subscribe(AddMenuItem, true);
,檢查是否必須將一個模塊名稱添加到列表視圖; - 在啓動時其動態加載的所有模塊從文件夾中:
- 每個IModule的類偵聽爲LoginEvent:
_ea.GetEvent<LoginEvent>().Subscribe(CheckRoles, true);
,檢查是否用戶具有導航到模塊的視圖中的許可; - 如果符合的話,withing的
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);
的執行執行的事件,但它不起作用。
您需要如此訂閱*之前*您發佈。 – mm8
@ mm8所以,我想這是強制性的。 –
是的,如果你想確保不會錯過任何事件,你應該確保你在其他人發佈相同事件之前訂閱。看到我的答案。 – mm8