我正在为我的项目使用Caliburn Micro,我决定使用Fluent Ribbon作为UI的一部分。我的ShellView非常简单,它的布局如下:
根据功能区的选定选项卡动态更改活动项目。
问题:
使用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约定,但我没有成功。
谢谢。
答案 0 :(得分:2)
不幸的是,由于没有答案,我会自己回答。
我确实设法编写额外的ViewLocator逻辑来定位我的功能区,但是这产生了一些问题(似乎CM中的绑定只能工作一次,所以在找到Ribbon并绑定到VM之后,其他上下文视图更改什么都不做。还有一些难以找到的错误。)
我采取了不同的方法。我已将Ribbon分离到它自己的ViewModel,并将其与其余模块合并到shell中。它使用EventAggregator,我也在必要时注入它。不是我希望的方法,但它现在有效。
如果有人发布更好的答案,我会定义接受那个。