在导体中显示多个屏幕并不起作用

时间:2016-09-12 16:51:16

标签: c# mvvm caliburn.micro caliburn

我想同时显示几个屏幕。只显示一个屏幕工作正常,但是当我将导体切换到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

DocumentView

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

修改 我想到了! 以前我想分别实例化图表和图例,这是错误的。 DocumentViewModel应该只负责实例化ChartDecorator。在ChartDecorator里面我可以创建尽可能多的装饰器类(例如ChartLegendViewModel)并且它们都被绘制出来。

1 个答案:

答案 0 :(得分:0)

根本没有使用IoC?其次,你能告诉我们bootstrapper和XAML会有所帮助。这些物品是否在一个单独的库中?通常,Conductor使用Screen或IScreen来访问“屏幕”生命周期。因此,除非DMChartBase继承屏幕(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它们都将是活动的“可以相互通信”但是由于控制的约束它们是不可见的,使用的对于这种情况(选项卡控件)但是如果它被更改为itemscontrols你还需要一些工作,因为视图不知道如何处理视图绑定到viewmodel