嵌套导体的屏幕未激活

本文关键字:激活 屏幕 嵌套 | 更新日期: 2023-09-27 18:30:58

我有一个继承自Conductor<Workspace>.Collection.OneActiveShellViewModel和一个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 的对象,并且调用 ActivateItemobject 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.OneActivePanelView具有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没有显示,我认为这与激活有关,因为没有调用被激活WorkspaceOnActivate方法。

我错过了什么?

编辑

我已经为那些倾向于审查它的人向 Git 存储库提交了一个例子:

嵌套导体的屏幕未激活

进一步阅读后,我相信我的实现在 OP 中描述有两个问题。

  1. 我的ContainerView ItemsControl.ItemTemplate DataTemplate不正确。 我似乎在显示View而不是ViewModel
  2. 由于我的ContainerView部分管理Screen一生,它应该继承Conductor而事实并非如此。

我已经为可能遇到相同或类似问题的任何人向 Git 存储库提交了一个有效的实现。