【问题标题】: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 中?

【问题讨论】:

    标签: wpf mvvm navigation


    【解决方案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 中,然后就可以设置了

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多