【问题标题】:ActivateItem not working in Caliburn.MicroActivateItem 在 Caliburn.Micro 中不起作用
【发布时间】: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>());
    }
}

可以看出,我正在尝试在 &lt;ContentControl x:Name="ActiveItem"/&gt; 中加载 RoomBandMainViewModel 问题是它没有加载,即使 ActivateItem(container.GetExportedValue&lt;RoomBandMainViewModel&gt;()) 代码运行,我也会得到一个空白屏幕。我认为&lt;ContentControl x:Name="ActiveItem"/&gt; 不存在于 RibbonView 中,而存在于其父 MainView 中,因此 ActivateItem 不起作用。

如何解决此问题。

编辑:

我必须将 &lt;ContentControl x:Name="ActiveItem"/&gt; 的 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>

现在&lt;ContentControl x:Name="ActiveItem" /&gt; 实际上属于 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


【解决方案1】:

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

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

您的RibbonViewModel 也可以是指挥。但只为它自己的孩子。可以有不止一个导体。

来自the caliburn documentation

一旦您将屏幕激活生命周期的概念引入 你的应用程序,你需要一些方法来执行它。这是角色 屏幕导体。当您显示屏幕时,售票员会确保 它已正确激活。

这是一种非常直接的说法:如果您有激活/生命周期,则使用导体。

【讨论】:

  • 查看我对我的问题发表的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 2015-02-18
  • 2014-10-19
  • 2019-09-09
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多