WPF MVVM在单击按钮的视图之间导航

时间:2019-03-04 21:41:33

标签: c# wpf mvvm

我正在尝试创建WPF应用程序,对于导航,我使用的是在

中找到的示例

https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/

现在,我需要在单击按钮时从一个UserControl导航到另一个。

有人可以指导我如何使用MVVM实现这一目标吗?或者,如果我应该考虑使用一些导航框架。

1 个答案:

答案 0 :(得分:1)

这在某种程度上取决于上下文,但是很多时候我使用一种技巧,即在某个ViewModel内有一个对象(或某种抽象类),其名称类似于“ MainContent”。这负责保存要在ContentControl中显示的内容。

我的XAML看起来像这样,其中Type1ViewType2ViewUserControl({{1}和vw_Type1是对其命名空间的引用),然后通过将vw_Type2设置为MainContentType1ViewModel的实例在它们之间进行导航。

Type2ViewModel

这可以通过使用<ContentControl Content="{Binding MainContent}"> <ContentControl.Resources> <DataTemplate DataType="{x:Type vm_Type1:Type1ViewModel}"> <vw_Type1:Type1View /> </DataTemplate> <DataTemplate DataType="{x:Type vm_Type2:Type2ViewModel}"> <vw_Type2:Type2View /> </DataTemplate> </ContentControl.Resources> </ContentControl> 外部的一个按钮(或以下示例中的两个按钮)来解决,该按钮向包含ContentControl的ViewModel发送命令,该命令只需更改{ {1}}属性,可以是MainContentMainContent的现有实例或新实例。例如:

Type1ViewModel

因此,为了完成此示例的XAML:

Type2ViewModel

(有关private Type1ViewModel _type1ViewModel; public Type1ViewModel Type1ViewModel { get { return _type1ViewModel; } set { if (_type1ViewModel != value) { _type1ViewModel = value; NotifyPropertyChanged(); } } } private Type2ViewModel _type2ViewModel; public Type2ViewModel Type2ViewModel { get { return _type2ViewModel; } set { if (_type2ViewModel != value) { _type2ViewModel = value; NotifyPropertyChanged(); } } } ... private ObservableObject _mainContent; public ObservableObject MainContent { get { return _mainContent; } set { if (_mainContent != value) { _mainContent = value; NotifyPropertyChanged(); } } } ... public InternalDelegateCommand NavigateToType1Command => new InternalDelegateCommand(NavigateToType1); public InternalDelegateCommand NavigateToType2Command => new InternalDelegateCommand(NavigateToType2); ... private void NavigateToType1() => MainContent = Type1ViewModel; private void NavigateToType2() => MainContent = Type2ViewModel; 的信息,请参见我对this question的回答。)