wpf - Caliburn Micro-使用容器的ActivateItem

标签 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(选定的详细项目)传递到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/

相关文章:

wpf - 当通过DataTemplate应用时,为什么没有代码隐藏我的WPF View 不起作用?

c# - 项目为 64 位时的奇怪(对我来说)Caliburn.Micro 行为

wpf - 在 WPF 应用程序中使用 IoC 解决依赖关系的位置在哪里?

wpf - 从源获取绑定(bind)目标?

wpf - WPF 绑定(bind)中单引号的用途是什么?

c# - 更改 TextBox 文本时 ViewModel 属性未更新

c# - 带有 Caliburn Micro wpf 的多个模板 TreeView

wpf - 使用 ViewModel 中的多态性绑定(bind)到具有 XAML 中的参数的方法

wpf - 如何根据我的 subview 模型的类型切换 Telerik 功能区 View 元素?

c# - 如何在ItemsControl中隐藏最后一个子控件