簡體   English   中英

ActivateItem在Caliburn.Micro中不起作用

[英]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也可以是導體。 但這只是為了自己的孩子。 可以有多個導體。

caliburn文檔

將屏幕激活生命周期的概念引入應用程序后,您需要某種方式來實施它。 這就是ScreenConductor的角色。 顯示屏幕時,導體將確保其已正確激活。

這是一個很直接的說法:如果您具有激活/生命周期,請使用導體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM