事件不会触发模块(棱镜,MVVM,silverlight c#)

时间:2010-10-18 18:01:00

标签: c# .net wpf silverlight prism

正确哦现在我相信我已经设置了这个应用程序,但如果我错了,请纠正我,为了简单起见,我在我的引导程序中加载了3个模块,一个是导航模块,另外两个是视图。

如果我加载模块,并且在初始化方法中将它们添加到一个完全正常工作的区域,那么在代码中是独立的,但是当然还有更多的控制权。

现在在导航视图模型中,我有一个事件聚合器,它发布一个事件(如果重要的话,继承自EventArgs的类)其他两个模块已订阅此事件但未收到它,

/// <summary>
    /// Carries the out menu item selection methods.
    /// </summary>
    /// <param name="e">The <see cref="TMBL.Web.TMBLCore.Controls.Assets.NavigationViewSelectionEventArgs"/> instance containing the event data.</param>
    public void CarryOutMenuItemSelectionMethods(NavigationViewSelectionEventArgs e)
    {
        _eventAggregator.GetEvent<NavigationMenuItemSelectedEvent>().Publish(e);
    }

在导航ViewModel中,然后在新闻模块中订阅

_eventAggregator.GetEvent<NavigationMenuItemSelectedEvent>().Subscribe(NavigationMenuReturnedEvent,
                                                                               ThreadOption.UIThread);

看起来很简单,我可以在我的导航模块中订阅此事件并将其选中,它只是不在模块之外,需要做些什么来实现这一目标?

事件聚合器也通过依赖注入推送到模块构造函数,然后存储在那里并通过构造函数传递给视图和视图模型(顺便说一下,视图是第一种方法)。虽然我在这里,我不知道这是否是问题的原因,但是让模块存储事件聚合器的实例并以这种方式传递它是不好的,例如

_displayNewsView = new DisplayNewsView(new DisplayNewsViewModel(_eventAggregator));

或者事件聚合器应该以不同的方式访问视图模型吗?

谢谢你的时间

2 个答案:

答案 0 :(得分:3)

您正在正确注入事件聚合器,但您需要检查几件事。

1)事件聚合器实例是否为应用程序的全局,而不是由每个模块创建。必须跨模块使用相同的实例。这应该在应用程序引导程序中创建并传递给每个模块。

2)NavigationMenuItemSelectionEvent是在跨模块共享的公共程序集中定义的吗?如果是这种情况(正如我所料)那么请确保跨模块使用相同的程序集。使用调试器加载应用程序时可以检查此项,并使用“模块”窗口(Debug&gt; Windows菜单)查看加载的程序集。该程序集只应列出一次。

如果您看到多次加载了公共程序集,那么可能是因为您正在从不同目录加载模块而且公共程序集未签名。 .Net会将这些视为独立的,因此NavigationMenuItemSelectionEvent类型将不匹配。

要么组件已签名,要么确保所有模块使用相同的程序集实例,要么确保所有模块都从同一目录加载(如果它也使用公共程序集,则包括应用程序)。

答案 1 :(得分:1)

好的堆栈溢出丢失了我的好回复。所以我需要在我的引导程序中使用事件聚合器实例,因为所有模块都需要使用相同的服务,这对我来说很有意义。但是我认为依赖注入会解决这个问题,我需要在我的引导程序中使用事件聚合器的实例?我的问题首先是如何实现它的两个方面

 protected override DependencyObject CreateShell()
    {
        _eventAggregator = new EventAggregator();
        var shell = Container.Resolve<Shell>();
        Application.Current.RootVisual = shell;
        return shell;
    }

那会有用吗?其次,如何将此实例传递给引导过滤器中的模块,因为当它们被添加到模块目录时,我相信

 protected override IModuleCatalog GetModuleCatalog()
    {
        var catalog = new ModuleCatalog();
        catalog.AddModule(typeof(TMBLCoreModule), InitializationMode.WhenAvailable);
        catalog.AddModule(typeof(NewsModule), InitializationMode.WhenAvailable);
        catalog.AddModule(typeof(UserModule), InitializationMode.WhenAvailable);
        return catalog;
    }

然后我如何将事件聚合器传递到每个模块中。我有一个快速的谷歌,但还没能找到这个信息,抱歉我的无知