[英]ActivateItem not working in Caliburn.Micro
我正在将Caliburn Micro用于MVVM。 在我的MainView(外壳)中,我有两个控件。 一个承载一个RibbonView,另一个承载ContentControl,该控件根据RibbonView菜单选择加载内容。 这是MainView(外壳)
MainView(外壳)
<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>
RibbonView
<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。
您这里拥有的是Windows的某种生命周期。 这必须由ActiveItem
的父窗口来处理。
caliburn.micro方法的实现方法是在ActiveItem
上方ActiveItem
一个Conductor。 在您的情况下,这是MainWindow
。
您的RibbonViewModel
也可以是导体。 但这只是为了自己的孩子。 可以有多个导体。
将屏幕激活生命周期的概念引入应用程序后,您需要某种方式来实施它。 这就是ScreenConductor的角色。 显示屏幕时,导体将确保其已正确激活。
这是一个很直接的说法:如果您具有激活/生命周期,请使用导体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.