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
而不是 ActivateItem
。 ActiveateItem
是设置 ActiveItem
属性.
的方法
启动应用程序时,我想默认打开一个用户控件,但只显示空的 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
而不是 ActivateItem
。 ActiveateItem
是设置 ActiveItem
属性.