遵循 MVVM 模式在 WPF 应用程序中处理导航的最佳方法是啥?

Posted

技术标签:

【中文标题】遵循 MVVM 模式在 WPF 应用程序中处理导航的最佳方法是啥?【英文标题】:What's the best way to handle navigation in a WPF application following the MVVM pattern?遵循 MVVM 模式在 WPF 应用程序中处理导航的最佳方法是什么? 【发布时间】:2011-01-21 23:26:31 【问题描述】:

我已经在 .xaml 文件后面的事件处理程序中看到了这一点,但它似乎并不遵循 MVVM 模式:MainApplication.mainFrame.Navigate(new HomePage());。是否有更好的方法可以在 ViewModel 中使用 MVVM 模式处理导航?还是在 XAML 中?

【问题讨论】:

【参考方案1】:

如果您希望根据数据的上下文显示不同的 UserControl,那么只需了解以下简单的 DataBinding 和 DataTemplate 概念并对其进行扩展。 想象一下,您有一个名为 CurrentViewModel 的属性,它绑定到 Window 内的 ContentControl 的内容

 <Window ... 
    <ContentControl Content="Binding CurrentViewModel" />
 </Window>

现在假设您有 ViewModel 类 ClassA 和 ClassB,因此适当地将实例设置为 CurrentViewModel 并为您的类定义全局 DataTemplates(视图)

<DataTemplate DataType="x:Type vm:ClassA">
    <local:UserControlForA../>
</DataTemplate>


<DataTemplate DataType="x:Type vm:ClassB">
    <local:UserControlForB../>
</DataTemplate>

现在 View 由 ViewModel 逻辑自动控制,WPF 将负责通过 Datatemplate 显示 UserControl。

如果您不熟悉 MVVM,最好使用这篇文章。 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

【讨论】:

这正是我正在做的,但我无法弄清楚:一旦我在视图中有一个 userControl,我将如何完成将 UserControl 更改为另一个控件然后来回到上一个?页面看起来很自然,但如果我也能以这种方式完成它,那就行了。 当你的视图完全是用数据绑定构建的,那么当“回来”只是设置视图模型的前一个实例时。所以我没有看到你的要求有什么不寻常的地方,以及 MVVM 的用途。 是的,我想我明白了。但是,我认为我们在不同的页面上。我了解如何更改在 tabControl 中呈现的 UserControl,如 Microsoft 指南中所示。我遇到的问题是:假设在“工作区”中的当前 UserControl 内部存在一个 menuOption 或按钮。我如何告诉该按钮将我导航到同一选项卡中的新用户控件? 根据您的要求,我想我在同一页面上。您是否尝试在其中制作带有 ICommands 的正确 ViewModel?然后按钮将具有命令和命令操作将设置 CurrentViewModel,因此视图将发生变化。如果您可以将您的情况简化为示例代码并添加问题,我们可以提供适当的帮助。 好的,我明天会得到一些示例代码。感谢您的帮助。【参考方案2】:

我认为如果您在另一个类中有导航,那么您尝试做的事情会更简单。见下文

public class FirstViewModel




public class SecondViewModel




public class NavigateViewModel

  public ViewModelBase CurrentVieModel get;set;

  public bool CanNavigate
  
     get  return true;//Or Add some custom logic here determine if you can navigate
  
  public void Navigate()
  
     //Just some arbitrary code
     if(CurrentViewModel is FirstViewModel)
       CurrentViewModel = new SecondViewModel();
  


现在就 1) 将页面内容绑定到 CurrentViewModel 2) 将 Navigate 方法包装在 ICommand 中,然后就可以设置了

可能无法满足您的需求,希望对您有所帮助

【讨论】:

以上是关于遵循 MVVM 模式在 WPF 应用程序中处理导航的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MVVM 模式中从页面导航到 WPF 中的页面?没有棱镜的概念[重复]

我在使用 MVVM for WPF 实现命令处理器模式时遇到问题

WPF、MVVM、导航、保持依赖注入完整

WPF MVVM:MainWindow导航

处理 WPF 应用程序中多个视图之间的导航

WPF 的综合指南:MVVM 与 MVP