【问题标题】:How to find out who did not handle an event如何找出谁没有处理事件
【发布时间】:2017-04-10 12:44:34
【问题描述】:

我们有一个使用 C#/WPF/Prism 构建的相当大的应用程序。该应用程序有几个静态模块和未知数量的动态加载模块。

我的影响领域是静态模块和外壳。

我被要求实现一个重新启动 shell 的功能,但只有在查询所有当前打开的模块是否允许重新启动之后。如果至少有一个模块表示不允许(例如:仍未保存的更改),则推迟重启。

现在外壳和模块通过EventAggregator 进行通信。这意味着我可以发布一个事件,然后查看是否有任何订阅者拒绝或允许重新启动。

这适用于我可以更改的所有模块。但是,我无法更改动态模块(不同的团队,不同的源代码管理)。

一个要求是,如果任何模块支持此新功能,则应将其视为拒绝重新启动。

显而易见的问题是,我如何才能发现有人没有订阅该活动?

尽管所有视图模型都实现了我们的IViewModel 接口,但我看不出有多少视图模型当前存在(因此我至少可以查看是否所有视图模型都允许,或者是否缺少某些答案)。

我可能会发现,有多少 模块 支持它,但即便如此,这也没有说明视图当前打开/存在/使用了多少视图模型。

有没有办法在不更改所述视图模型的情况下确定活动视图模型是否不支持此功能?

【问题讨论】:

  • 当 prism 加载模块时,您在 shell 中 could update some counter 以跟踪加载的模块数量。您还应该有许多接受或拒绝重新启动的模块。将它们加起来应该等于您拥有的计数器变量。我错过了什么吗?
  • @3615 这是我目前的解决方法,拥有一个模块可以拥有的属性,这样我就可以找出有多少 modules 不支持它。但是一个模块可能有多个视图和多个视图模型,所以有 X 个模块,我还不如得到 X-Y 甚至 X+Y 回复......如果是 X+Y 我仍然不知道是否有视图和视图模型漂浮在那个周围没有回答:(
  • 此外,如果我可以忽略一个不支持它的模块,如果它没有打开的视图/视图模型,那就太好了。

标签: c# wpf prism eventaggregator


【解决方案1】:

您可以随时查看 IRegionManager.Regions 以查找所有现有区域。集合中的每个 IRegion 都有 IRegion.ActiveViews,它给出了该区域中所有当前活动视图的列表。然后可以检查每个视图(它是一个对象)是否附加了某些属性或实现了某些接口。然后,如果视图是 FrameworkElement,您还可以检查它的 DataContext。

如果发现没有属性/接口的视图,该视图不支持重启。如果视图具有属性/接口,则查询该接口。

如果您创建其他(范围)区域管理器,则需要跟踪它们。您维护一个活动区域管理器列表,最初仅包含附加到外壳的区域管理器。在检查视图时,如果视图是 FrameworkElement 并且附加了区域管理器并且附加的区域管理器不在列表中,则将其添加到列表中并使用相同的算法检查由该区域管理器控制的视图。

【讨论】:

  • 哇,谢谢,听起来很酷,我明天试试这个(剩下的时间恰好是一场漫长的会议……哦,真高兴)。我们所有的视图都实现了一个接口,其中视图模型是它的一部分。那应该可以。
  • 是的,这就是我要找的,非常感谢 :)
猜你喜欢
  • 2020-01-10
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多