1

我在这里浏览了 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 {
    ....
}

两者都在同一个窗口中。

4

1 回答 1

1

我不确定到底是什么问题。在你的许多指挥中,你有一个Items由 Caliburn.Micro 提供的集合。当您开始显示详细视图时,您可以检查该集合是否存在该详细视图(使用您从主视图中获得的主键)。

如果该项目已经在Items集合中,那么只需激活它(使用ActivateItem方法)。如果该项目不在集合中,则实例化它(如果您使用 MEF,可能使用工厂),并将其添加到Items集合中,然后激活它。

于 2012-11-13T11:16:17.750 回答