在 conductor 中显示多个屏幕不起作用

Displaying multiple screens in conductor doesn't work

我想同时显示几个屏幕。只显示一个屏幕工作正常,但是当我将我的指挥切换到 Conductor<DMChartBase>.Collection.AllActive 并添加另一个项目时,它仍然只呈现一个项目。

public class DocumentViewModel : Conductor<DMChartBase>.Collection.AllActive
{
    public ChartLegendViewModel ChartLegendVm { get; set; }

    public DocumentViewModel()
    {
         ChartLegendVm = new ChartLegendViewModel();
         ActivateItem(ChartLegendVm);
    }

    public void ChangeChart(DMChartBase chart, Column[] columns)
    {
        ActivateItem(chart);
        Items.Last().Init(columns);
        Items.Refresh();
    }
}

DocumentView

<ItemsControl x:Name="Items"></ItemsControl>

我找不到任何不起作用的原因。有什么想法吗?

编辑: 我的代码结构如下所示:

public class ShellViewModel : Screen
    public class DocumentViewModel : Conductor<DMChartBase>.Collection.AllActive
        public class ChartLegendViewModel : ChartDecorator
            public abstract class ChartDecorator : DMChartBase
                 public abstract class DMChartBase : Screen

文档视图:

<UserControl ...>
    <Grid>
        <ItemsControl x:Name="Items">
    </Grid>
</UserControl>

ChartLegendView:

<UserControl ....>
    <ListView>
        <ListViewItem Content="First value"></ListViewItem>
        <ListViewItem Content="Second value"></ListViewItem>
        <ListViewItem Content="Third value"></ListViewItem>
    </ListView>
</UserControl>

引导程序:

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

编辑: 我想到了! 以前我想分别实例化 Chart 和 Legend 这是错误的。 DocumentViewModel应该只负责实例化ChartDecorator。在 ChartDecorator 中,我可以根据需要创建任意数量的装饰器 类(例如 ChartLegendViewModel),它们都会被绘制出来。

根本不用IoC?其次,您能否向我们展示引导程序,XAML 会有所帮助。这些项目是否在单独的图书馆中?通常,Conductor 使用 Screen 或 IScreen 来访问 "screens" 生命周期。所以除非 DMChartBase 继承 screen(IScreen) 我不认为你会得到一个激活...

//MEF IoC Container -- CM Built-in
[Export(typeof(MainWindowViewModel))]
public class MainWindowViewModel : Conductor<IScreen>.Collection.OneActive
{
    [ImportingConstructor]
    public MainWindowViewModel([ImportMany]IEnumerable<IScreen> screens)
    {
        DisplayName = "COmposition Example - CM";


        Items.AddRange(screens.Reverse());
    }

    protected override void OnActivate()
    {
        ActivateItem(Items[0]);
    }
}

举个例子...它显示了所有这些,但如果您将其更改为 AllActive,则只有一个处于活动状态,它们都将处于活动状态 "can inter-communicate" 但由于控件的限制,它们不可见,用于这种情况(选项卡控件),但如果它已更改为项目控件,您仍然需要做一些工作,因为视图不知道如何处理视图与视图模型的绑定