Prism wtf将实体传递给模态视图的模型

时间:2010-09-02 19:13:50

标签: c# mvvm prism

我正在使用带有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();

1 个答案:

答案 0 :(得分:2)

你可以使用与Ade Miller的缓存事件聚合器类似的东西。这个链接来自'08,但它应该仍然有用:http://www.ademiller.com/blogs/tech/2008/11/adding-store-and-forward-support-to-the-prism-eventaggregator/

想法是发布活动,如果没有订阅者,请将其存储到第一个订阅者出现。

我希望这会有所帮助。

谢谢, 达米安