嵌套导体的屏幕未激活

时间:2014-11-19 17:12:20

标签: c# xaml caliburn.micro

我有ShellViewModel继承自Conductor<Workspace>.Collection.OneActiveShellView,其ContenControl x:Name属性为ActiveItem。< / p>

请注意,Workspace会继承Screen

ShellViewModel

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"));
    }
}

ShellView

<ContentControl x:Name="ActiveItem" />

在上文中,我的Items集合已成功填充了Workspace的对象,object of WorkspaceContentControl被调用时成功显示ActivateItem

ActiveItemScreen,而不是Conductor<Workspace>,其中包含ObservableCollection<PanelViewModel>。我的ContainerView有一个ItemsControl,其ItemsSource绑定到PanelViewCollection,其模板覆盖以使用`UniformGrid显示。

ContainerViewModel

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);
    }
}

ContainerView

<ItemsControl ItemsSource="{Binding PanelViewCollection}>
    <ItemsControl.ItemsPanel>
          <ItemsPanelTemplate>
               <UniformGrid/>
          </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

我的Button上的ContainerView调用了AddPanelViewModel上的ContainerViewModel函数,并且new PanelViewModel被添加到集合中,并在ContainerView上显示{1}}。

到目前为止,一切似乎都正常。

PanelViewModel继承自Conductor<Workspace>.Collection.OneActivePanelView的{​​{1}}属性为ContenControl,属性为ActiveItem。

PanelViewModel

x:Name

的PanelView

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方法{ {1}}被激活没有被调用。

我错过了什么?

修改

对于那些我倾向于审核它的人,我已经为Git repo提供了一个例子:

1 个答案:

答案 0 :(得分:3)

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

  1. 我的ContainerView ItemsControl.ItemTemplate DataTemplate不正确。我似乎在显示View而不是ViewModel
  2. 由于我的ContainerView部分管理Screen有效期,它本应继承自Conductor,而不是{{1}}。
  3. 对于可能遇到相同或类似问题的任何人,我已向Git repo提交了有效的实施方案。