【问题标题】:Caliburn Micro - ActivateItem using ContainerCaliburn Micro - 使用容器激活项目
【发布时间】:2012-11-01 03:32:54
【问题描述】:

我正在浏览 Caliburn Micro 文档 here。同时,我试图提出一些粗略的代码进行实验。我对如何使用容器激活项目以及如何将对象传递给我们正在激活的 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(选定的详细信息项)传递到 DetailViewModel。如果我们在这里使用 EventAggregator,那么每个打开的 DetailViewModels 都会收到我不确定如何处理的事件。

如果有人能对以上两个问题有所了解,我将不胜感激

更新: 大师就是这样的指挥家

public class MainViewModel : Conductor<IScreen>.Collection.OneActive, IShell {
    ....
}

细节是这样定义的

public class TabViewModel : Screen {
    ....
}

两者都在同一个窗口中。

【问题讨论】:

  • 你有两个独立的窗口吗?一个用于主视图,一个用于详细视图(在一个选项卡控件中,为每个打开的详细视图显示一个选项卡),或者您是否有一个导体从显示主视图切换到显示选定的详细视图?
  • @devdigital,主人是Conductor.Collection.OneActive,细节是Screen。请参阅更新的问题。谢谢

标签: wpf mvvm caliburn.micro


【解决方案1】:

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

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

【讨论】:

  • 我在想类似的事情。感谢您理解我的困惑并解决它。实际上,我不确定是否有针对我提到的情况的一些开箱即用的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
相关资源
最近更新 更多