我正在尝试创建WPF应用程序,对于导航,我使用的是在
中找到的示例https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/
现在,我需要在单击按钮时从一个UserControl导航到另一个。
有人可以指导我如何使用MVVM实现这一目标吗?或者,如果我应该考虑使用一些导航框架。
答案 0 :(得分:1)
这在某种程度上取决于上下文,但是很多时候我使用一种技巧,即在某个ViewModel内有一个对象(或某种抽象类),其名称类似于“ MainContent”。这负责保存要在ContentControl
中显示的内容。
我的XAML看起来像这样,其中Type1View
和Type2View
是UserControl
({{1}和vw_Type1
是对其命名空间的引用),然后通过将vw_Type2
设置为MainContent
或Type1ViewModel
的实例在它们之间进行导航。
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}}属性,可以是MainContent
或MainContent
的现有实例或新实例。例如:
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的回答。)