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

什么';在遵循MVVM模式的WPF应用程序中处理导航的最佳方法是什么?,wpf,mvvm,navigation,Wpf,Mvvm,Navigation,我在.xaml文件后面的事件处理程序中看到了这一点,但它似乎不符合MVVM模式:MainApplication.mainFrame.Navigate(new HomePage())。在ViewModel中是否有更好的方法处理MVVM模式的导航?或者在XAML?中,如果您希望根据数据的上下文显示不同的用户控件,那么只需理解以下简单的数据绑定和数据模板概念并加以扩展即可。 假设您有一个名为CurrentViewModel的属性,该属性绑定到窗口内ContentControl的内容 <Wind

我在.xaml文件后面的事件处理程序中看到了这一点,但它似乎不符合MVVM模式:
MainApplication.mainFrame.Navigate(new HomePage())。在ViewModel中是否有更好的方法处理MVVM模式的导航?或者在XAML?

中,如果您希望根据数据的上下文显示不同的用户控件,那么只需理解以下简单的数据绑定和数据模板概念并加以扩展即可。 假设您有一个名为CurrentViewModel的属性,该属性绑定到窗口内ContentControl的内容

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

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

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中,即可设置


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

这正是我正在做的,但我无法理解:一旦我在视图中拥有一个userControl,我将如何将该userControl更改为另一个控件,然后返回到上一个控件?页面看起来很自然,但如果我也能这样做,那就行了。当你的视图完全建立在数据绑定上时,“回来”只是设置ViewModel的前一个实例。所以我看不出你们的需求有什么不寻常的地方,MVVM的用途是什么。是的,我想我理解这一点。然而,我认为我们的立场不同。我了解如何更改tabControl中呈现的UserControl,如Microsoft指南所示。我遇到的问题是:假设“工作区”中的当前用户控件中存在一个菜单选项或按钮。我如何告诉该按钮将我导航到同一选项卡中的新userControl?我想我是根据您的要求在同一页面上的。您是否尝试过使用ICommand制作适当的视图模型?然后按钮将有命令,命令操作将设置CurrentViewModel,因此视图将更改。如果你能将你的情况简化为一个示例代码并添加问题,我们可以提供适当的帮助。好的,我明天会得到一些示例代码。谢谢你的帮助。
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();
  }

}