ActivateItem在Caliburn.Micro中不起作用

时间:2015-03-31 05:53:19

标签: wpf caliburn.micro

我正在使用Caliburn Micro for MVVM。在我的MainView(shell)中,我有两个控件。一个托管RibbonView和另一个ContentControl,它根据RibbonView菜单选择加载内容。这是MainView(shell)

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>

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。

1 个答案:

答案 0 :(得分:0)

这里有你的窗户的某种生命周期。这必须由ActiveItem的父窗口处理。

通过caliburn.micro方式完成此操作的方法是在ActiveItem之上设置导体。在您的情况下,这是MainWindow

您的RibbonViewModel也可以成为指挥。但只是为了自己的孩子。可以有多个导体。

来自the caliburn documentation

  

一旦您将屏幕激活生命周期的概念引入   你的应用程序,你需要一些方法来强制执行它。这是作用   ScreenConductor。当您显示屏幕时,指挥确认   它被正确激活。

这是一个直接的说法:如果你有激活/生命周期,那么使用指挥。