即使我可以很好地利用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
派生,因此它们具有通常的屏幕生命周期(OnActivate
,OnDeactivate
等)。您的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" />