我在我的项目中使用Caliburn Micro,我决定使用Fluent Ribbon作为UI的一部分。我的ShellView非常简单,它的布局是这样的:
- Ribbon Control with 4 tabs.
- ActiveItem。
活动项根据功能区所选择的选项卡动态更改。
问题:
使用Ribbon控件作为我当前活动的ViewModel (ActiveItem)的第二个视图,同时保持模块化和继承CM本身的所有优点的正确方法是什么?此外,在我的ViewModels之间"共享"我的Ribbon控件需要什么?
细节:
我的ShellViewModel的类型是"Conductor.Collection"。OneActive",它将ActiveItem更改为与选定选项卡关联的特定ViewModel(当事件被触发时)。
我的Ribbon在XAML中是这样定义的:<ContentControl x:Name="RibbonBar" Micro:View.Model="{Binding ActiveItem}" Micro:View.Context="Ribbon" />
如它所示,Ribbon控件被绑定到当前活动的项,作为它的上下文视图。这实际上适用于一个视图,因为由于默认的CMs约定,它在子命名空间中寻找上下文视图(例如,如果我到视图的路径是 views)。TasksTabView,它将在Views.TasksTab.Ribbon中查找上下文视图。
问题是,当我改变ActiveItem,上下文视图不能再定位了,由于不同的命名空间,所以它只适用于一个选项卡。
我也试着写我自己的ViewLocator约定,但我没有成功。
谢谢。
不幸的是,由于没有答案,我将自己回答。
我确实设法编写了额外的ViewLocator逻辑来定位我的Ribbon,但这产生了一些问题(似乎CM中的绑定只工作一次,所以在Ribbon被定位并绑定到VM之后,额外的上下文视图更改什么也不做。)还有一些很难发现的bug)。
我已经采取了不同的方法。我已经将Ribbon分离到它自己的ViewModel,并将其与其他模块组合到shell中。它使用EventAggregator,我还在必要的地方注入了它。这不是我所希望的,但它现在可以工作了。
如果有人贴出更好的答案,我一定会接受的。