嵌套导体的屏幕未激活
本文关键字:激活 屏幕 嵌套 | 更新日期: 2023-09-27 18:30:58
我有一个继承自Conductor<Workspace>.Collection.OneActive
的ShellViewModel
和一个ShellView
,它的ContenControl
x:Name
属性为 ActiveItem
。
请注意,Workspace
继承Screen
。
壳视图模型
public class ShellViewModel : Conductor<Workspace>.Collection.OneActive
{
ShellViewModel(IEnumerable<Workspace> items)
{
this.Items = items;
// below is not how I activate, just an example for descriptive purposes
this.ActivateItem(this.Items.FirstOrDefault(e => e.Id == "Container"));
}
}
壳景
<ContentControl x:Name="ActiveItem" />
在上面,我的 Items
集合成功填充了 Workspace
的对象,并且调用 ActivateItem
时object of Workspace
成功显示在ContentControl
中。
ActiveItem
是包含ObservableCollection<PanelViewModel>
的Screen
而不是Conductor<Workspace>
。 我的ContainerView
有一个ItemsControl
,其ItemsSource
绑定到PanelViewCollection
,其模板覆盖以使用"UniformGrid"显示。
容器视图模型
public class ContainerViewModel : Screen
{
// get/set implantation missed for brevity
public ObservableCollection<PanelViewModel> PanelViewCollection
{
get;
set;
}
public void AddPanelViewModel()
{
var @new = new PanelViewModel();
this.PanelViewCollection.Add(@new);
}
}
容器视图
<ItemsControl ItemsSource="{Binding PanelViewCollection}>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
我ContainerView
上的一个Button
调用ContainerViewModel
上的AddPanelViewModel
函数,并将new PanelViewModel
添加到集合中,并在ContainerView
上可见。
到目前为止,一切似乎都正常。
PanelViewModel
继承自Conductor<Workspace>.Collection.OneActive
,PanelView
具有x:Name
属性"活动项"的ContenControl
。
面板视图模型
public class PanelViewModel : Conductor<Workspace>.Collection.OneActive
{
PanelViewModel(IEnumerable<Workspace> items)
{
this.Items = items;
// below is not how I activate, just an example for descriptive purposes
this.ActivateItem(this.Items.FirstOrDefault(e => e.Id == "PanelA"));
}
}
面板视图
<StackPanel>
<TextBlock Text="There be treasure here!" />
<ContentControl x:Name="ActiveItem" />
</StackPanel>
显示PanelView
时(我在这里看到宝藏),ActiveItem
没有显示,我认为这与激活有关,因为没有调用被激活Workspace
的OnActivate
方法。
我错过了什么?
编辑
我已经为那些倾向于审查它的人向 Git 存储库提交了一个例子:
进一步阅读后,我相信我的实现在 OP 中描述有两个问题。
- 我的
ContainerView
ItemsControl.ItemTemplate
DataTemplate
不正确。 我似乎在显示View
而不是ViewModel
。 - 由于我的
ContainerView
部分管理Screen
一生,它应该继承Conductor
而事实并非如此。
我已经为可能遇到相同或类似问题的任何人向 Git 存储库提交了一个有效的实现。