在 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" 但由于控件的限制,它们不可见,用于这种情况(选项卡控件),但如果它已更改为项目控件,您仍然需要做一些工作,因为视图不知道如何处理视图与视图模型的绑定
我想同时显示几个屏幕。只显示一个屏幕工作正常,但是当我将我的指挥切换到 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" 但由于控件的限制,它们不可见,用于这种情况(选项卡控件),但如果它已更改为项目控件,您仍然需要做一些工作,因为视图不知道如何处理视图与视图模型的绑定