2015-03-31 88 views
1

我正在使用Caliburn Micro for MVVM。在我的MainView(shell)中,我有两个控件。一个托管一个RibbonView,另一个ContentControl根据RibbonView菜单选项加载内容。这里是的MainView(壳)ActivateItem无法在Caliburn.Micro中工作

的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>()); 
    } 
} 

可以看出,我试图加载RoomBandMainViewModel<ContentControl x:Name="ActiveItem"/>问题是它没有加载,我得到一个空白的屏幕,即使ActivateItem(container.GetExportedValue<RoomBandMainViewModel>())代码运行。我认为<ContentControl x:Name="ActiveItem"/>不存在RibbonView但其父母MainView,因此ActivateItem不起作用。

如何解决此问题。

编辑:

我不得不设置<ContentControl x:Name="ActiveItem"/>到RibbonViewModel的DataContext的,让ActiveItem现在RibbonViewModel的财产,而不是MainViewModel。 MainViewModel看起来像下面

所以的MainView(壳)现在是如下

<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。

+0

这看起来像我在做什么,不得不仔细看看。稍后回答。 – 2015-03-31 06:02:18

+0

我正在做的正是你在这里做一个项目。也许有一些关于你的mainwindow/shellview的信息缺失。在我的情况下,ShellViewModel是指挥,所以它有一个Activeitem。我想在那里显示的窗口是该主窗口的子窗口。它就像一个魅力。 – 2015-03-31 08:40:17

+0

@MareInfinitus,MainView(问题中显示)是我的应用程序的shell视图。它有两个内容控件RibbonView和ActiveItem。但ActivateItem不在MainViewModel中。它是MainViewModel的子项RibbonViewModel的一部分。总之,当控件位于MainView中时,如何激活RibbonViewModel中的控件。 – Jatin 2015-03-31 10:51:53

回答

0

你在这里有什么是你窗口的某种生命周期。这必须由您的ActiveItem的父窗口处理。

完成caliburn.micro方法的方法是在ActiveItem之上有一个导体。在你的情况下,这是MainWindow

您的RibbonViewModel也可以是导体。但只限于自己的孩子。可以有多个导体。

the caliburn documentation

一旦你介绍一个屏幕激活生命周期的概念引入 您的应用程序,你需要一些方法来执行它。 ScreenConductor的作用就是 。当您显示屏幕时,售票员确保 已正确启动。

这是一种相当直接的说法:如果您有激活/生命周期,那么请使用指挥。

+0

查看我发布到我的问题的评论 – Jatin 2015-03-31 10:52:17

相关问题