2009-11-26 73 views
0

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

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

解决此问题的建议方法是什么?我看到了一些选择,但我认为他们都听起来有点冒失。现在我正在创建上面示例中的MasterCustomerView。然后这个视图将检查条件并打开UserControl,给出Admin的详细信息。尽管我对这个解决方案并不满意 - 它会是一种合法的方法吗?好点?

回答

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的工作方式(实际上,我将所有菜单注册并将它们转换为Commands)。这样,如果相关信息中的某些条件会使菜单项无效,模块也可以选择禁用自身。

事实上,这只是解决这个问题的很多方法之一,但这与我所做的很接近。希望你找到它有帮助,或者让你考虑替代方法来解决问题。

+0

感谢您的回复。我开始实施类似的方法,但很显然,这会变得有点复杂。所以如果有更好的解决方案,我想这样做。研究用事件聚合来解决问题。看起来很有希望。 – stiank81

+0

我以前见过一个事件聚合器解决方案,并且肯定会起作用(这是我最初的方式),但它变得非常混乱,并且您失去了关注点分离......您正在使模块负责操作菜单系统。它*起初感觉不错,但很快变得难以管理,特别是如果您有其他开发人员制作模块。 –

+0

对我来说,看起来合理的是,模块本身在需要时决定做什么。这样做菜单项只是一个标题和点击时触发的事件。至少现在我发现这比在菜单项中构建逻辑更合理。 – stiank81