我正在阅读Caliburn Micro纪录here。同时,我试图提出一些粗略的实验代码。我对如何使用容器激活项目以及如何将对象传递给我们正在激活的ViewModel感到困惑。
让我们考虑一个主/细节场景。主服务器包含一个列表(比如datagrid),详细信息包含主服务器中用于更新的特定行(比如选项卡控件中的选项卡项)。在文档中(为了便于理解),我相信ViewModel的详细信息是使用这样的代码直接实例化的
public class ShellViewModel : Conductor<IScreen>.Collection.OneActive {
int count = 1;
public void OpenTab() {
ActivateItem(new TabViewModel {
DisplayName = "Tab " + count++
});
}
}
因此,要在现实世界的应用程序中应用上述基本概念,我们需要使用容器(比如MEF)实例化DetailViewModel(上面的TabViewModel)。接下来的挑战是知道特定的DetailViewModel是否已在TAB控件中打开。我想到的直接原因是维护一个打开的选项卡列表(DetailViewModels)。但后来我们再次在MasterViewModel中引用DetailViewModel来破坏目的。有没有可用的选项来解决这个问题。
令我不安的第二件事是如何将对象从MasterViewModel(Selected Detail Item)传递给DetailViewModel。如果我们在这里使用EventAggregator,那么每个打开的DetailViewModel都将收到我不确定如何处理的事件。
如果有人能对上述两个问题有所了解,我将不胜感激
更新 师父就像这样的指挥
public class MainViewModel : Conductor<IScreen>.Collection.OneActive, IShell {
....
}
细节定义如下
public class TabViewModel : Screen {
....
}
两者都在同一个窗口中。
答案 0 :(得分:1)
我不确定究竟是什么问题。在你的许多指挥中,你有一个由Caliburn.Micro提供的Items
集合。当您显示详细视图时,可以检查此集合是否存在该详细信息视图(使用主视图中的主键)。
如果该项目已在Items
集合中,则只需将其激活(使用ActivateItem
方法)。如果该项目不在集合中,则将其实例化(如果您使用MEF,可能使用工厂),并将其添加到Items
集合中,然后将其激活。