我在这里浏览了 Caliburn Micro 文档。同时,我试图提出一些粗略的代码进行实验。我对如何使用容器激活项目以及如何将对象传递给我们正在激活的 ViewModel 感到有些困惑。
让我们考虑一个主/细节场景。主控包含一个列表(比如数据网格),详细信息包含来自主控的特定行以进行更新(比如选项卡控件内的选项卡项)。在文档中(为了便于理解),我相信细节 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,那么每个打开的 DetailViewModels 都会收到我不确定如何处理的事件。
如果有人能对以上两个问题有所了解,我将不胜感激
更新: 大师是这样的指挥
public class MainViewModel : Conductor<IScreen>.Collection.OneActive, IShell {
....
}
细节是这样定义的
public class TabViewModel : Screen {
....
}
两者都在同一个窗口中。