【问题标题】:Prism - Conditional navigation棱镜 - 条件导航
【发布时间】:2009-11-26 10:13:23
【问题描述】:

我在我的 Wpf 应用程序中使用 Prism 进行导航。我有几个模块,每个模块都通过使用引导程序中的 IoC 容器发送的常用命令在主菜单中注册自己。菜单条目绑定到用于导航的常用命令 - 这将在某些区域中打开正确的视图。一切都基于我通过 Prism 网站找到的建议。

我现在的问题是我有一个模块,其中有一个条件说明我是否要在主要区域中打开 ViewA 或 ViewB。示例:假设我有一个客户模块 - 然后是一个“客户”菜单项,它将在主视图中打开客户模块。还有一个条件:如果我有一个活跃的客户,我想在点击菜单项时打开 CustomerDetailsView,否则我想打开 CustomersAdminView。

解决此问题的推荐方法是什么?我看到了一些选项,但我认为所有这些选项听起来都有些骇人听闻。现在我正在创建上面示例中的 MasterCustomerView。然后,此视图将检查条件并打开 UserControl,在其中提供 Admin 的详细信息。不过,我对这个解决方案并不完全满意——这会是一种合法的方法吗?好点?

【问题讨论】:

    标签: .net wpf navigation prism


    【解决方案1】:

    在我围绕 Prism 构建的菜单系统中,我为注册视图的模块提供了重载,允许它们传递委托,而不是视图的类型。在这个委托中,我可以将相关信息传递给委托,以便它可以决定如何创建其视图。

    这有点复杂,但我可以给你一些相关的例子。

    public interface IMenuRegistry
    {
         void RegisterMenuItem(string title, 
                               Func<RelevantInformation, Object> executeFunction, 
                               Func<RelevantInformation, bool> canExecuteFunction);
    
         void RegisterMenuItem(string title, Type viewType);
    }
    

    注意这里我有一个在“RelevantInformation”中传递的类型,它可以包含当前客户等。当用户单击菜单项时,我调用委托并传递它可能需要制作的所有信息它的决定。它返回一个 View 对象,然后我可以将其放入任何合适的区域。

    我还允许模块传递“canExecute”委托,类似于命令的工作方式(实际上,我获取所有菜单注册并将它们转换为命令)。这样,如果 RelevantInformation 中的某些条件会使菜单项无效,模块也可以选择禁用自身。

    实际上,这只是解决此问题的众多方法之一,但这与我所做的很接近。希望它对您有所帮助,或者让您思考解决问题的替代方法。

    【讨论】:

    • 感谢您的回复。我开始实施类似的方法,但很早就清楚这会变得有点复杂。因此,如果有更好的解决方案,我想改为这样做。而是考虑使用事件聚合来解决它。看起来很有希望。
    • 我以前见过一个事件聚合器解决方案,它肯定会起作用(这是我一开始的方式),但它变得非常混乱,你失去了关注点的分离......你正在做负责菜单系统操作的模块。一开始感觉不错,但很快就变得难以管理,尤其是当你有其他开发人员制作模块时。
    • 对我来说,模块本身决定在请求时做什么似乎是合理的。这样做菜单项只是一个标题和单击时它们要触发的事件。至少现在我发现这比在菜单项中构建逻辑更合理。
    • 感谢您的回答。不过,我已经改用事件聚合了,我觉得新架构看起来不错。如果我们将来看到这方面的问题,我可能会采用您的策略或类似的策略。
    • 这很好,它非常接近我的建议,只是在订阅和过滤事件聚合事件方面还有另一个步骤,你必须这样做才能让一切正常工作。在我上面的情况下,您不需要这个额外的部分,也不必相信模块作者知道这部分。它更简单。事件聚合方法当然会起作用。
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 2023-03-14
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多