在MVVM模式之后处理WPF应用程序中的导航的最佳方法是什么?

时间:2010-02-28 09:03:46

标签: wpf mvvm navigation

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

2 个答案:

答案 0 :(得分:8)

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

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

现在假设你有ViewModel类ClassA和ClassB,所以适当地将实例设置为CurrentViewModel并为你的类定义全局DataTemplates(Views)

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


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

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

如果您不熟悉MVVM,请更好地使用本文。 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

答案 1 :(得分: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)将导航方法包装在ICommand中,然后设置

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

相关问题