即使我可以很好地利用CM,我仍然认为自己是初学者。我在Codeplex的Rob Eisenberg的《屏幕和导体等》上阅读了此nice introduction。如果我正确理解,导体本身就是一个屏幕,并且可能会显示屏幕。

但是我看不出如何开始实现这样的东西(非常伪代码):

XAML

<Grid>
  <Left x:Name="Menu" />
  <Right x:Name="Content/ActiveItem" />
</Grid>

现在,如何加载两个不同的屏幕或导体,以在这两个位置显示?

我试图从“HelloScreens”示例中了解,但可悲的是,它有很多依赖关系,我不知道如何运行它。我可以看到ShellView似乎有两个目标区域,一个是通常的“ ActiveItem ”,另一个是“ Dialogs ”,但是在“Dialogs”上进行字符串搜索后却什么也没有发现。此时此刻发生了太多的魔术。

因此,我的问题。最终掌握View如何最终出现在XAML中以及如何通过Caliburn.micro实现如上所示的最佳方法是什么?

干杯

最佳答案

Caliburn提供了几种开箱即用的导体。一个导体不带任何项目(但包含一个ActiveItem),而两个导体则带一个项目和一个ActiveItem的集合。

当然,您也可以实现自己的指挥,但这听起来没有必要。听起来您只是想让自己的ShellViewModel成为指挥者,也许最合理的做法就是收集一系列正在执行的项目,因此您可以从ShellViewModel派生您的Conductor<IScreen>.Collection.OneActive

您的菜单不需要执行任何项目,它可能只需要引用Items上的ShellViewModel集合即可。在ShellViewModel构造函数中,您可以实例化将出现在菜单上的每个 View 模型(最好是使用抽象工厂),然后将Items引用传递给MenuViewModel
ShellViewModel进行的每个项目都可以从Screen派生,因此它们具有通常的屏幕生命周期(OnActivateOnDeactivate等)。您的MenuViewModel未被执行,并且不需要屏幕生命周期,因此可以从PropertyChangedBase派生。

使用Caliburn.Micro,只要 View 上的ContentControl与名称本身就是 View 模型的 View 模型的属性同名,Caliburn.Micro就会定位该 View 模型 View ,并将其注入(inject)到ContentControl中,并注意束缚。

因此,您的ShellViewModel可以具有MainMenu类型的MenuViewModel属性,并且您的shell View 如下所示:

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="200" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
</Grid>

<ContentControl x:Name="MainMenu" Grid.Column="0" />
<ContentControl x:Name="ActiveItem" Grid.Column="1" />

10-06 14:35