2

我在我的项目中使用 Caliburn Micro,我决定使用 Fluent Ribbon 作为 UI 的一部分。我的 ShellView 非常简单,布局如下:

  • 带 4 个选项卡的功能区控件。
  • 活动项目。

活动项目根据功能区的选定选项卡动态更改。

问题:

将 Ribbon 控件用作我当前活动的 ViewModel (ActiveItem) 的第二个视图的正确方法是什么,同时保持模块化和 CM 本身继承的所有好东西?另外,在我的 ViewModel 之间“共享”我的 Ribbon 控件需要什么?

细节:

我的 ShellViewModel 属于“ Conductor.Collection.OneActive ”类型,它将 ActiveItem 更改为我与选定选项卡关联的特定 ViewModel(触发事件时)。

我的功能区在 XAML 中定义如下:

<ContentControl x:Name="RibbonBar" Micro:View.Model="{Binding ActiveItem}" Micro:View.Context="Ribbon" />

如图所示,功能区控件绑定到当前活动项,因为它是上下文视图。这实际上适用于一个视图,因为由于默认的 CM 约定,它会在子命名空间中查找上下文视图(例如,如果我的视图路径是Views.TasksTabView,它将在Views.TasksTab 中查找上下文视图。丝带)。

问题是,当我更改 ActiveItem 时,由于命名空间不同,无法再定位上下文视图,因此它仅适用于一个选项卡。

我也尝试过编写自己的 ViewLocator 约定,但没有成功。

谢谢你。

4

1 回答 1

2

不幸的是,由于没有答案,我会自己回答。

我确实设法编写了额外的 ViewLocator 逻辑来定位我的 Ribbon,但这产生了一些问题(似乎 CM 中的绑定只工作一次,所以在 Ribbon 被定位并绑定到 VM 之后,额外的上下文视图更改什么都不做。有一些很难找到的错误)。

我当时采取了不同的方法。我已将 Ribbon 与它自己的 ViewModel 分离,并将其与其余模块组合到 shell 中。它使用 EventAggregator,我也在必要的地方注入它。不是我希望的方法,但它现在有效。

如果有人发布更好的答案,我肯定会接受那个。

于 2012-02-14T21:09:54.003 回答