我正在通过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(选定的详细项目)传递到DetailViewModel。如果我们在这里使用EventAggregator,则每个打开的DetailViewModels都会收到我不确定如何处理的事件。
如果有人能对以上两个问题有所了解,我将不胜感激
更新:
师父就是这样的指挥
public class MainViewModel : Conductor<IScreen>.Collection.OneActive, IShell {
....
}
细节定义如下
public class TabViewModel : Screen {
....
}
两者都在同一个窗口中。
最佳答案
我不确定是什么问题。在许多指挥家中,您有Caliburn.Micro提供的Items
集合。当您显示详细 View 时,可以检查该集合是否存在该详细 View (使用主 View 中的主键)。
如果该项目已经在Items
集合中,则只需激活它即可(使用ActivateItem
方法)。如果该项目不在集合中,则将其实例化(如果使用的是MEF,则可以使用工厂实例化),然后将其添加到Items
集合中,然后将其激活。
关于wpf - Caliburn Micro-使用容器的ActivateItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13348307/