我们有一个使用C#/ WPF / Prism构建的相当大的应用程序.该应用程序有一些静态模块和未知数量的动态加载模块.
我的影响范围是静态模块和shell.
我被要求实现一个将重启shell的功能,但只有在查询所有当前打开的模块后才能重启.如果至少有一个模块表示不允许(例如:仍然未保存的更改),则重新启动将被推迟.
现在shell和模块通过EventAggregator进行通信.这意味着我可以发布一个事件,然后查看是否有任何订阅者拒绝或允许重新启动.
这适用于我可以更改的所有模块.但是,我无法更改动态模块(不同的团队,不同的源代码控制).
一个要求是,如果任何模块不支持此新功能,则应将其视为拒绝重新启动.
显而易见的问题是,我怎么知道,有人没有订阅这个活动?
虽然所有的视图模型都实现了我们的IViewModel接口,但我认为无法找出当前存在多少视图模型(因此我至少可以看到是否所有视图模型都允许它,或者是否只是缺少一些答案).
我可能会发现,有多少模块支持它,但即使这样,也没有说明视图当前打开/存在/使用了多少视图模型.
有没有办法在不更改所述viewmodel的情况下找出活动视图模型是否不支持此功能?
最佳答案 在任何给定时刻,您都可以查看IRegionManager.Regions以查找所有现有区域.集合中的每个IRegion都有IRegion.ActiveViews,它提供了该地区所有当前活动视图的列表.然后可以检查每个视图(它是一个对象)是否附加了某个属性或实现某个接口.然后,如果视图是FrameworkElement,您还可以检查其DataContext.
如果找到没有属性/接口的视图,则视图不支持重新启动.如果视图具有属性/接口,则查询该接口.
如果您创建其他(范围)区域管理器,则需要跟踪它们.您维护一个活动区域管理器列表,最初只包含附加到shell的区域管理器.在检查视图时,如果视图是FrameworkElement并且附加了区域管理器,并且附加的区域管理器不在列表中,则将其添加到列表中并使用相同的算法检查该区域管理器控制的视图.