我有一个类似于下面显示的模型的WPF / prism应用程序:
两个TabControls都包含一个单独的Prism区域,第二个嵌套到第一个区域。现在,工具栏应激活/取消激活项目,具体取决于当前活动的视图。
工具栏目前在shell中定义。
我尝试使用某种注册表,其中每个ViewModel都可以注册它支持的工具栏命令。然而,我意识到工具栏无法知道哪个视图(以及哪个视图模型)是活动的。
问题在于嵌套,如果没有,我可以通过将TabControl.SelectedItem属性绑定到工具栏并使用上面的注册表来实现我想要的。
也许有更好的方法可以做到这一点?或者让工具栏找出哪个视图处于活动状态的方法?
编辑:我现在尝试使用本文中描述的ActiveAware ViewModel:http://www.codeproject.com/Articles/56826/ViewModel-Active-Awareness-in-a-Prism-Based-Applic,但是我现在遇到的问题是当我从Tab“One”切换到Tab“ “然后,嵌套标签的”First Tab“GotFocus事件未被触发,这意味着工具栏将代表错误的视图。
也许这是要走的路?
编辑2:问题似乎是第二个tabcontrol不在其自己的作用域内。我正在使用ViewDiscovery方法向我的区域添加视图,因此我不会明确地在范围内创建regionmanager。 SyncActiveState似乎只适用于作用域区域,因为切换视图时第一个tabcontrol视图模型正确地更新。
有没有办法使用XAML创建范围区域而不是普通区域?
答案 0 :(得分:1)
这里的问题是工具栏对活动区域一无所知;他们故意脱钩。
我会(个人)使用Event Aggregator发布来自活动ViewModel的消息来说“我当前处于活动状态”并让工具栏订阅这些消息并根据需要更新按钮。
答案 1 :(得分:0)
如果我试图这样做,我可能会创建一个IToolbarManager,它具有每个可用工具栏操作的bool属性,以及操作本身的ICommand。
然后,在具体类型中实现此接口,其中bool属性更改命令的CanExecute值,并调用CommandManager.InvalidRequerySuggested。将此类型注册为容器的单例,然后使用DI将其注入每个视图和shell中。然后,Shell可以将工具栏按钮数据绑定到IToolbarManager中的命令,然后视图可以设置操作是否在初始化时启用。
我没有代码示例,因为我正在考虑如何解决这个问题,但希望您能按照我的建议进行操作,并证明它很有帮助。
答案 2 :(得分:0)
我现在最终创建了一个扩展的TabControl,它使用SelectionChanged事件在实现特定接口的所有项目上设置IsActive。它还沿着VisualTree走下去,找到任何扩展的TabControl,并为这些项目做同样的事情,等等。
在这里工作得很好,到目前为止我们只使用TabControls,所以这个解决方案适合我。