我想同时显示几个屏幕。只显示一个屏幕工作正常,但是当我将导体切换到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)并且它们都被绘制出来。
答案 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