Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 棱镜-条件导航_.net_Wpf_Navigation_Prism - Fatal编程技术网

.net 棱镜-条件导航

.net 棱镜-条件导航,.net,wpf,navigation,prism,.net,Wpf,Navigation,Prism,我在Wpf应用程序中使用Prism进行导航。我有几个模块,每个模块都通过使用引导程序中的IoC容器发送的常用命令在主菜单中注册自己。菜单项绑定到常用的导航命令-这将在某些区域打开正确的视图。所有这些都是基于我在Prism网站上找到的建议 我现在的问题是,我有一个模块,其中有一个条件说明我是否要在主区域中打开ViewA或ViewB。示例:假设我有一个客户模块,然后是一个“客户”菜单项,它将在主视图中打开客户模块。还有一个条件:如果我有一个活动客户,我想在单击菜单项时打开CustomerDetail

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

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


解决这个问题的推荐方法是什么?我看到了一些选择,但我认为它们听起来都有点老套。现在我正在创建上面示例中的MasterCustomerView。然后,该视图将检查该条件并打开UserControl,其中给出了Admin的详细信息。不过,我并不完全满意这个解决方案——这是一个合法的方法吗?更好吗

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

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

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

     void RegisterMenuItem(string title, Type viewType);
}
公共接口IMenuRegistry
{
无效注册表项(字符串标题,
Func executeFunction,
Func canExecuteFunction);
无效注册表项(字符串标题,类型viewType);
}
请注意,这里我有一个类型,它在“RelevantInformation”中传递,可以包含当前客户等。当用户单击菜单项时,我调用代理并传递其可能需要做出决策的所有信息。它返回一个视图对象,然后我可以将其放入任何合适的区域

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


实际上,这只是解决这个问题的众多方法中的一种,但这与我所做的非常接近。希望您觉得它有帮助,或者让您思考解决问题的其他方法。

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