【发布时间】:2011-01-21 23:26:31
【问题描述】:
我已经在 .xaml 文件后面的事件处理程序中看到了这一点,但它似乎并不遵循 MVVM 模式:MainApplication.mainFrame.Navigate(new HomePage());。是否有更好的方法可以在 ViewModel 中使用 MVVM 模式处理导航?还是在 XAML 中?
【问题讨论】:
标签: wpf mvvm navigation
我已经在 .xaml 文件后面的事件处理程序中看到了这一点,但它似乎并不遵循 MVVM 模式:MainApplication.mainFrame.Navigate(new HomePage());。是否有更好的方法可以在 ViewModel 中使用 MVVM 模式处理导航?还是在 XAML 中?
【问题讨论】:
标签: wpf mvvm navigation
如果您希望根据数据的上下文显示不同的 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
【讨论】:
我认为如果您在另一个类中有导航,那么您尝试做的事情会更简单。见下文
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 中,然后就可以设置了
可能无法满足您的需求,希望对您有所帮助
【讨论】: