【问题标题】:Caliburn.Micro view switchingCaliburn.Micro 视图切换
【发布时间】:2015-10-30 12:53:28
【问题描述】:

在 CM WPF 应用程序中,我有以下项目:

<Window> <!-- Shell Window -->
 <ContentControl x:Name="MainRegion">
 <ContentControl x:Name="SearchRegion">
<Window>

观看次数:

MainRegionView
SearchRegionView

查看模型:

MainRegionViewModel //implements Conductor<Screen>
SearchRegionViewModel //implements Conductor<Screen>

我需要从 MainRegionViewModel 切换 SearchRegionViewModel 的视图。 以下代码在MainRegionViewModel内执行。

ViewModelTest test = new ViewModelTest();
//Calling the method from object reference
searchRegionViewModel.ActivateItem(test);

问题: 视图未在 SearchRegionView 中加载。 如何将视图加载到 SearchRegion?

【问题讨论】:

  • 如果我在 SearchRegionViewModel 的构造函数中添加以下代码ViewModelTest test = new ViewModelTest(); this.ActivateItem(test);,则加载视图。我不知道为什么从对象引用调用 ActivateItem() 时它没有加载。
  • 因为您在这里实际拥有的是具有多个视图模型设置的“多个”视图(完全不同的想法)。如果您想要切换视图本身,您可以做的是将布局更改为具有所述名称的 1 &lt;ContentControl x:Name=ActiveItem /&gt;。然后,当您调用 ActivateItem(test) 时,视图实际上会切换出去,并且 viewmodel 将与切换到的 ViewModel 相关联。
  • 如果您愿意,两个视图都可以在运行时可见,如果您的属性名称与您命名的内容控件相对于它们各自的视图模型完全一样,则不需要视图切换,将其视为复合看法。当然,如果它们重叠,那么只有一个是可见的。
  • 是的,我有两个单独的区域来加载视图。实际上,我正在尝试将 SearchView 加载到单独的区域中。我正在使用 MahApps Metro 弹出按钮来加载 SearchView。所以弹出窗口出现了,但视图没有加载到它上面。这可能吗?
  • 哦,是的......您的搜索和主视图模型应该继承 Screen 而不是 Conductor&lt;Screen&gt;,除非您打算使用 Main 和 Search 来托管其他“屏幕”。唯一“应该”继承Conductor&lt;Screen&gt; 或其派生的一个是ShellViewModel,然后它将用于激活和停用ActiveItem 将持有的视图模型。此外,我之前的示例一旦它们是“屏幕”而不是导体就可以工作. 塞德里克是正确的。

标签: c# wpf mvvm caliburn.micro


【解决方案1】:

您的MainRegionViewModelSearchRegionView 需要实现Screen,而您的ShellViewModel 是需要实现Conductor 的。之后,您需要在 XAML (ShellView.xaml) 中绑定 ActiveItem。

<ContentControl x:Name="ActiveItem"></ContentControl>

在您的 ShellViewModel 中使用 Activate(YourViewModel)

这是Example

如果您想更改 MainRegionViewModel 中的 ActiveItem,您需要查看 EventAggregator 向您的 ShellViewModel 发布消息到 Activate 所需的 ViewModel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多