ViewModel 未从 ActivateItem() 激活

ViewModel not activated from ActivateItem()

启动应用程序时,我想默认打开一个用户控件,但只显示空的 shell 视图。

遵循通常的 Caliburn 模式并在 ShellViewModel 构造函数中使用 SimpleContainer 一切都执行得很好,但看不到激活的虚拟机。

ShellViewModel

public class ShellViewModel : Conductor<object>, IHandle<NewLayoutCreatedEvent>
    {
        private readonly SimpleContainer _container;
        private readonly IEventAggregator _events;
        private readonly IWindowManager _manager;

        public ShellViewModel(IEventAggregator events, IWindowManager manager, SimpleContainer container)
        {
            _events = events;
            _events.Subscribe(this);

            _manager = manager;
            _container = container;

            ActivateItem(_container.GetInstance<WorkLayoutViewModel>());
        }
}

WorkLayoutViewModel 继承自 Screen。在 Bootstrapper class 中,在 运行 WorkLayoutViewModel 的构造函数之后发生的事情:

protected override object GetInstance(Type service, string key)
{
    return _container.GetInstance(service, key);
}

使用空键和服务调用一次 = ShellViewModel 然后继续:

protected override IEnumerable<object> GetAllInstances(Type service)
{
    return _container.GetAllInstances(service);
}

再次服务 ShellViewModel,它在 ShellView class 中运行 InitializeComponent()。 之后跳转到:

protected override void OnStartup(object sender, StartupEventArgs e)
{
    DisplayRootViewFor<ShellViewModel>();
}

发件人是应用程序本身,没有参数。在此之后,在我设置语言并调用 base.OnStartup()

的地方调用了 App class OnStartup() 覆盖

我相信 GetAllInstances 也应该调用 WorkLayoutViewModel 而不仅仅是 ShellViewModel,这并没有发生,视图也没有显示。

根据 ShellView 的要求:

<Window x:Class="MyApp.Views.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyApp.Views"
        xmlns:lang="clr-namespace:MyApp.Language;assembly=MyApp.Language"
        xmlns:interact="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        xmlns:cal="http://www.caliburnproject.org"
        mc:Ignorable="d"
        Title="{x:Static lang:Resources.AppName}" Height="800" Width="1000" WindowStartupLocation="CenterScreen">
    <DockPanel>
        <StackPanel DockPanel.Dock="Top">
            <Menu FontSize="14" Height="27">
                <Menu.ItemsPanel>
                    <ItemsPanelTemplate>
                        <DockPanel HorizontalAlignment="Stretch" />
                    </ItemsPanelTemplate>
                </Menu.ItemsPanel>
                <MenuItem Header="{x:Static lang:Resources.Mnu_File}" HorizontalAlignment="Left">
                    <MenuItem Header="{x:Static lang:Resources.Mnu_New}">
                        <MenuItem.Icon>
                            <Image Source="/Images/new.png" />
                        </MenuItem.Icon>
                        <interact:Interaction.Triggers>
                            <interact:EventTrigger EventName="Click">
                                <cal:ActionMessage MethodName="NewLayout"/>
                            </interact:EventTrigger>
                        </interact:Interaction.Triggers>
                    </MenuItem>
                </MenuItem>
            </Menu>

            <ToolBar Height="36">
                <Button ToolTip="{x:Static lang:Resources.Tip_New}">
                    <Image Source="/Images/new.png" />
                    <interact:Interaction.Triggers>
                        <interact:EventTrigger EventName="Click">
                            <cal:ActionMessage MethodName="NewLayout"/>
                        </interact:EventTrigger>
                    </interact:Interaction.Triggers>
                </Button>
            </ToolBar>
        </StackPanel>
        <Grid>
            <ContentControl x:Name="ActivateItem" Margin="10 5 10 10" />
        </Grid>
    </DockPanel>
</Window>

并且 WorkLayoutView 只是一个带有红色背景的标准 UserControl。

您在 window 中的 ContentControl 可能应该被称为 ActiveItem 而不是 ActivateItemActiveateItem 是设置 ActiveItem 属性.

的方法