将色带控制与Caliburn Micro接口的好方法是什么?

时间:2012-01-03 15:07:24

标签: c# wpf mvvm caliburn.micro ribbon-control

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

  • 带有4个标签的功能区控件。
  • ActiveItem。

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

问题:

使用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" />

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

问题是,当我更改ActiveItem时,由于名称空间不同,无法再找到上下文视图,因此它仅适用于一个Tab。

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

谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

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