棱镜 - 条件导航

时间:2009-11-26 10:13:23

标签: .net wpf navigation prism

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

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

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

1 个答案:

答案 0 :(得分:2)

在我围绕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”委托,类似于Command的工作方式(事实上,我将所有菜单注册并将其转换为命令)。这样,如果RelevantInformation中的某些条件会使菜单项无效,模块也可以选择禁用自身。

实际上,这只是解决这个问题的众多方法之一,但这与我的工作很接近。希望您觉得它有用,或者让您考虑解决问题的其他方法。