【发布时间】:2015-06-04 08:54:48
【问题描述】:
我将 Caliburn Micro 用于 MVVM。在我的 MainView (shell) 中,我有两个控件。一个承载一个 RibbonView 和另一个 ContentControl,它根据 RibbonView 菜单选择加载内容。这是 MainView (shell)
主视图(外壳)
<Window x:Class="HotelReservation.Main.Views.MainView">
<DockPanel>
<ContentControl x:Name="RibbonView" DockPanel.Dock="Top"/>
<Grid DockPanel.Dock="Bottom" VerticalAlignment="Stretch" >
<ContentControl x:Name="ActiveItem"/>
</Grid>
</DockPanel>
</Window>
功能区视图
<Ribbon Margin="0,-20,0,0">
<RibbonTab Header="Room Band">
<RibbonGroup>
<RibbonButton Label="List" x:Name="RoomBandMain"
LargeImageSource="/HotelReservation.Global;component/Images/room-band-list-icon.png">
</RibbonButton>
</RibbonGroup>
</RibbonTab>
</Ribbon>
RibbonViewModel
public class RibbonViewModel : Conductor<object> {
public void RoomBandMain() { //Load in ActiveItem of MainView
ActivateItem(container.GetExportedValue<RoomBandMainViewModel>());
}
}
可以看出,我正在尝试在 <ContentControl x:Name="ActiveItem"/> 中加载 RoomBandMainViewModel 问题是它没有加载,即使 ActivateItem(container.GetExportedValue<RoomBandMainViewModel>()) 代码运行,我也会得到一个空白屏幕。我认为<ContentControl x:Name="ActiveItem"/> 不存在于 RibbonView 中,而存在于其父 MainView 中,因此 ActivateItem 不起作用。
如何解决此问题。
编辑:
我必须将 <ContentControl x:Name="ActiveItem"/> 的 DataContext 设置为 RibbonViewModel,以便 ActiveItem 现在是 RibbonViewModel 的属性,而不是 MainViewModel。 MainViewModel 如下所示
所以MainView(shell)现在如下
<Window x:Class="Conductor_Main.Views.MainView">
<DockPanel>
<ContentControl x:Name="RibbonView" DockPanel.Dock="Top"/>
<Grid DockPanel.Dock="Bottom" VerticalAlignment="Stretch" Background="Green"
DataContext="{Binding RibbonView}">
<ContentControl x:Name="ActiveItem" />
</Grid>
</DockPanel>
</Window>
现在<ContentControl x:Name="ActiveItem" /> 实际上属于 RibbonViewModel。
【问题讨论】:
-
这看起来像我在做什么,必须仔细看看。稍后再回答。
-
我正在做您在项目中所做的事情。也许缺少有关您的主窗口/ shellview 的一些信息。在我的例子中,ShellViewModel 是导体,所以它有一个 Activeitem。我要显示的窗口是该主窗口的子窗口。它就像一个魅力。
-
@MareInfinitus,MainView(显示问题)是我的应用程序的外壳视图。它有两个内容控件 RibbonView 和 ActiveItem。但是 ActivateItem 不在 MainViewModel 中。它是 RibbonViewModel 的一部分,它是 MainViewModel 的子项。简而言之,当控件位于 MainView 中时,如何在 RibbonViewModel 中激活控件。
-
所以你想使用你的 RibbonView 的一部分也显示在你的 MainView 中吗? ActiveItem 在您的 RibbonView 和 MainView 的子项之外。你想在这里进行某种回收吗?
-
@MareInfinitus,我刚刚将具有 ActiveItem 的 ContentControl 的 DataContext 更改为 RibbonViewModel,以便 ActiveItem 现在是 RibbonViewModel 的一部分并正确加载。请查看我对问题的编辑。
标签: wpf caliburn.micro