【问题标题】:Navigation using Caliburn.Micro使用 Caliburn.Micro 进行导航
【发布时间】:2013-07-03 11:23:16
【问题描述】:

我想知道使用 Caliburn.Micro 在两个不相关的视图模型之间导航的最传统方法是什么?假设在应用程序的一部分中有一个视图模型树:ParentViewModel->ChildVM1->ChildVM2 等。此外,还有一个 OmniVM 应该能够导航到上述任何视图模型。通过“导航”,我的意思是找到适当的实例(之后激活部分很简单)。 我不想涉及任何 IEventAggregator 的使用,也不想涉及 Container.Resolve 之类的东西。 感谢回复

【问题讨论】:

  • 您能否详细说明您想要实现的目标?您指的是需要执行多个屏幕的 ShellViewModel 吗?

标签: wpf navigation caliburn.micro


【解决方案1】:

devdigital 在评论中说过,我要在这里再说一遍,正如 Rob (编写框架的架构师) 所说,架构在 UI 中也很重要。这意味着您应该考虑如何组织表示层。换句话说,您是否将拥有一个选项卡式界面,其中主窗口将是一个 Caliburn.Micro Conductor 和选项卡进行屏幕,或者您是否将拥有一个使用停靠窗口和工具栏的 Visual Studio 类型的 UI,请考虑构建 UI 时的这种思维方式。现在,如果您不喜欢架构而只想设计 GUI,那么我可以告诉您 Screen 和 Conductor 是导航时要考虑的最重要的类。我强烈建议您阅读 Screens, Conductors and Compositions 文章(如果您还没有这样做的话),它将让您了解我在说什么以及一堆有用的想法。

编辑:针对您的具体情况,并且由于您有这种深度嵌套的结构,我将在MenuViewModel 上创建一个导航界面,如下所示:

public interface IMenuNavigator {
    void NavigateToItem(Item i);
}

然后我会将它注入到那些内部视图模型中,我想你已经明白我的意思了。另一方面,您也可以使用IEventAggregator,它用于在不相关的组件(viewmodels) 之间进行松散耦合的通信,例如在您的情况下,您可以在聚合器上发布消息以进行导航和MenuViewModel 倾听并正确处理它们。根据您的具体内部情况,您甚至可以提出更好的想法。希望对您有所帮助。

【讨论】:

  • 我已经阅读了这篇文章,并且我对 C. Micro 处理表示层的方式非常熟悉。然而,我还没有找到一种定义明确的方式来允许在视图模型树的不同部分之间导航。例如,我有一个 ShellViewModel,它只是一个有两个孩子的导体:MainViewModel 和 LoginViewModel。现在 MainViewModel 本身就是一个导体,它包含,比如说,MenuViewModel 和 ContentViewModel。 MenuViewModel 有一个选项列表,它本身就是一个导体,而 ContentViewModel 有不同的内容,可能非常复杂。
  • 我希望能够从 ContentViewModel 内部的任何内部视图模型获取到 MenuViewModel 的特定项目。你如何实现这样的功能?我希望,我已经很好地澄清了我的问题))
  • @GenaVerdel,我已经编辑了答案,请检查编辑。
  • 感谢您的回复。就像我说的,为了这个特定的目的,我倾向于避免使用事件聚合器。同样,它相当于将 INavigator 注入到每个应该支持导航的视图模型中,所以它似乎没有增加任何价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 2016-01-28
  • 1970-01-01
相关资源
最近更新 更多