好的哦,现在我相信我已经正确设置了这个应用程序,但如果我错了请纠正我,为了简单起见,我在我的 Bootstrap 中加载了 3 个模块,一个是导航模块,另外两个是 View 。
如果我加载模块并在初始化方法中将它们添加到所有工作正常的区域,则在代码中独立,但是当然 id 更喜欢一些控制。
现在在导航 View 模型中,我有一个事件聚合器,它发布一个事件(如果这很重要,则继承自 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);
看起来很简单,我可以在我的导航模块中订阅这个事件,它会拾取它,它不会离开模块,需要做什么才能实现这一点?
此外,事件聚合器通过依赖注入(inject)被推送到模块构造函数,然后存储在那里并通过构造函数传递给 View 和 View 模型(顺便说一下, View 优先方法)。虽然我在这里,但我不知道这是否是问题的原因,但是让模块存储事件聚合器的实例并以这种方式传递它是否不好,例如
_displayNewsView = new DisplayNewsView(new DisplayNewsViewModel(_eventAggregator));
或者事件聚合器是否应该以不同的方式访问 View 模型?
谢谢你的时间
最佳答案
您正在正确地注入(inject)事件聚合器,但您需要检查几件事。
1) 事件聚合器实例是应用程序的全局实例,而不是由每个模块创建的。必须跨模块使用相同的实例。这应该在应用程序 Bootstrap 中创建并传递给每个模块。
2) NavigationMenuItemSelectionEvent 是否在跨模块共享的通用程序集中定义?如果是这种情况(如我所料),则确保跨模块使用相同的程序集。您可以在使用调试器加载应用程序并使用模块窗口(调试 > Windows 菜单)查看加载的程序集时检查这一点。该程序集应仅列出一次。
如果您看到多次加载公共(public)程序集,则可能是因为您从不同的目录加载模块并且公共(public)程序集未签名。 .Net 会将它们视为独立的,因此 NavigationMenuItemSelectionEvent 类型将不匹配。
要么对程序集进行签名以确保所有模块都使用相同的程序集实例,要么确保所有模块都从同一目录加载(包括应用程序,如果它也使用公共(public)程序集)。
关于c# - 事件不会跨模块触发(prism、MVVM、silverlight c#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3961966/