【问题标题】:Navigating through multiple child views contained in Main Window在主窗口中包含的多个子视图中导航
【发布时间】:2014-04-17 15:34:45
【问题描述】:

我正在开发一个 WPF MVVM 应用程序,我需要一个只有一个徽标的主窗口,并且它必须在其中显示子视图。我在主窗口中没有任何控件,所有控件都驻留在子视图中,例如下一步、返回、取消和一些文本块等按钮。现在,如果用户在子视图上选择下一步按钮,我必须绘制或加载下一个主窗口内的子视图。如果单击后退按钮,我必须返回上一个子视图。所以基本上我根据点击哪个按钮来改变子视图。此外,我为每个子视图维护不同的视图模型。现在的问题是我无法弄清楚我应该如何将子视图链接到相应的视图模型。此应用程序类似于一些安装应用程序,其中根据选择和用户单击的按钮显示不同的对话框。我是这个 wpf 的新手,不想使用 MVVM Light、Prism 等。任何详细的帮助都会很大赞赏。提前致谢。

【问题讨论】:

  • Prism 有大量代码专门用于导航和维护查看历史记录。您为什么不想使用已经这样做的现有框架?
  • @Mashton 感谢您的建议 :) 实际上我是这个 wpf 的新手,不想将自己与这些不同的类型混淆。将来我绝对应该选择 Prism 和其他类似的东西。

标签: c# wpf mvvm


【解决方案1】:

将任何数据类型与 XAML 控件相关联的最简单方法之一是使用 DataTemplate。因此,您可以简单地将类似这样的内容添加到您的Application.Resources 中,并且只要您不要在DataTemplates 上设置x:Key 属性,那么它们将被框架显式应用每当遇到您的视图模型实例时:

<DataTemplate DataType="{x:Type ViewModels:HomeViewModel}">
    <Views:HomeView />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
    <Views:MainView />
</DataTemplate>

那么显示视图就这么简单:

<ContentControl Content="{Binding YourViewModelProperty"} />

在代码后面,或者你的视图模型中:

YourViewModelProperty = new MainViewModel();

为您的视图模型创建一个基类通常很方便,然后该类型的 YourViewModelProperty 可以,您将能够使用相同的属性和 ContentControl 交换它们。


更新>>>

一般的想法是你有一个MainViewModel 类和一个BaseViewModel 属性数据绑定到MainWindow.xaml 中的一个ContentControl...导航控件也应该在MainWindow.xaml 中而不是在视图中他们自己。这样,MainViewModel 类在收到来自MainWindow.xaml 的导航Commands 时,负责将属性更改为相关的视图模型实例。

【讨论】:

  • 从未想过绑定到 ViewModel 类型并为视图使用模板。非常聪明,+1!
  • @Sheridan 感谢您的回答。我在这里有疑问,我需要在哪里拥有 YourViewModelProperty。我是否需要有一个公开此属性的应用程序范围的视图模型。如果是,我如何在第一个视图的按钮单击事件上从一个视图切换到另一个视图时更改此属性。我可以理解 wpf 将根据 YourViewModelProperty 中存在的内容在主窗口上绘制视图。但是假设我完成了第一个视图并想向用户显示下一个视图我该怎么做?
  • @Sheridan 感谢您抽出宝贵时间。效果很好。
  • 如何以这种方式将 HomeViewModel 的实例放入 HomeView?
  • 你是什么意思如何?这如何。
猜你喜欢
  • 2012-05-28
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多