Caliburn Micro - 使用Container的ActivateItem

时间:2012-11-12 17:19:33

标签: wpf mvvm caliburn.micro

我正在阅读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 {
    ....
}

两者都在同一个窗口中。

1 个答案:

答案 0 :(得分:1)

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

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