遵循 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 中的页面?没有棱镜的概念[重复]