我正在使用带有Prism 2.0框架和WPF的MVVM模式。我遇到了模态窗口的问题,并使用事件初始化ViewModel。在我的模块中,我有一些代码创建了一个对象,然后我想将它传递给我的ViewModel,以便View可以绑定到它的属性。
通常我会使用EventAggregator发布一个包含我的对象的事件,该事件可以在ViewModel中订阅。但是在这种情况下,我正在创建一个新的模态窗口,因此在我可以发布它之前,不会及时创建ViewModel来订阅该事件。我试图避免将对象作为DataContext传递给Window或恢复到其他机制。有没有人有解决方案让这个工作?也许某种方式在调用ShowDialog或Show之前强制View加载?
var popup= new PopUpWindow();
regionManager.RegisterViewWithRegion("MyRegion", typeof(MyView));
eventAggregator.GetEvent<NotifyObjectEvent>().Publish(myObject);
// ViewModel only created and subscribes to event when the line below is run
popup.ShowDialog();
我做这项工作的黑客如下,但我想知道是否有一个更优雅的解决方案我错过了?
var popup= new PopUpWindow();
regionManager.RegisterViewWithRegion("MyRegion", typeof(MyView));
popup.Show();
popup.Hide();
eventAggregator.GetEvent<NotifyObjectEvent>().Publish(myObject);
popup.ShowDialog();
好吧也许我已经弄明白了,似乎至少工作......
var popup= new PopUpWindow();
regionManager.RegisterViewWithRegion("MyRegion", typeof(MyView));
RegionManager.SetRegionManager(popup, regionManager);
regionManager.AddToRegion("MyRegion", typeof(MyView));
eventAggregator.GetEvent<NotifyObjectEvent>().Publish(myObject);
popup.ShowDialog();
答案 0 :(得分:2)
你可以使用与Ade Miller的缓存事件聚合器类似的东西。这个链接来自'08,但它应该仍然有用:http://www.ademiller.com/blogs/tech/2008/11/adding-store-and-forward-support-to-the-prism-eventaggregator/
想法是发布活动,如果没有订阅者,请将其存储到第一个订阅者出现。
我希望这会有所帮助。
谢谢, 达米安