0

我有一个类似于下面显示的模型的 WPF/prism 应用程序:

布局

两个 TabControl 都包含一个单独的 Prism 区域,第二个区域嵌套在第一个区域中。现在工具栏应该根据当前处于活动状态的视图来激活/停用项目。

工具栏当前在 shell 中定义。

我尝试使用某种注册表,每个 ViewModel 都可以注册它支持的工具栏命令。但是,我随后意识到工具栏无法知道哪个视图(因此哪个视图模型)处于活动状态。

问题出在嵌套中,否则我可能通过将 TabControl.SelectedItem 属性绑定到工具栏并从上面使用我的注册表来实现我想要的。

也许有更好的方法来做到这一点?或者让工具栏找出哪个视图处于活动状态的方法?

编辑:我现在尝试使用本文中描述的 ActiveAware ViewModel:http: //www.codeproject.com/Articles/56826/ViewModel-Active-Awareness-in-a-Prism-Based-Applic,但是我现在有了当我从选项卡“一”切换到选项卡“二”并返回时,不会触发嵌套选项卡的“第一个选项卡”GotFocus 事件,这意味着工具栏将代表错误的视图。

也许这是要走的路?

编辑 2:问题似乎是第二个 tabcontrol 不在它自己的作用域内。我正在使用 ViewDiscovery 方法向我的区域添加视图,因此我没有明确地在范围内创建 regionmanager。SyncActiveState 似乎仅适用于范围区域,因为第一个 tabcontrol 视图模型在切换视图时正确更新。

有没有办法使用 XAML 创建一个作用域区域而不是普通区域?

4

3 回答 3

1

这里的问题是工具栏对活动区域一无所知;它们是故意分离的。

我会(个人)使用事件聚合器从活动的 ViewModel 发布消息以说“我当前处于活动状态”,并让工具栏订阅这些消息并根据需要更新按钮。

于 2012-07-25T00:56:58.080 回答
0

如果我试图这样做,我可能会创建一个 IToolbarManager,它为每个可用的工具栏操作具有 bool 属性,并为操作本身创建一个 ICommand。

然后,在具体类型中实现此接口,其中 bool 属性会更改命令的 CanExecute 值,并调用 CommandManager.InvalidRequerySuggested。将此类型注册为容器中的单例,然后使用 DI 将其注入每个视图和 shell。然后,Shell 可以将工具栏按钮数据绑定到 IToolbarManager 中的命令,然后视图可以设置在初始化时是否启用这些操作。

我没有代码示例,因为我只是在思考如何解决这个问题,但希望你能按照我的建议进行操作,并且它证明是有帮助的。

于 2012-07-25T00:34:02.620 回答
0

我现在最终创建了一个扩展的 TabControl,它使用 SelectionChanged 事件在所有实现特定接口的项目上设置 IsActive。它还沿着 VisualTree 查找任何扩展的 TabControl,并对这些项目执行相同的操作,依此类推。

在这里工作得很好,到目前为止我们只使用 TabControls,所以这个解决方案对我有用。

于 2012-07-26T13:10:31.853 回答