WPF MVVM导航视图

use*_*088 44 c# navigation wpf mvvm

我有一个包含多个视图的WPF应用程序.我想从视图1到视图2的toswitch,从那里我可以切换到多个视图.所以我想在视图1上有一个按钮,它在同一窗口中加载view2.

我试过这些东西,但不能让它发挥作用.

从第一个链接问题是我不理解viewmodellocator代码.他们调用CreateMain(); 函数但是这个定义在哪里,以及如何从视图内部切换到另一个视图.

She*_*dan 112

首先,您不需要任何这些工具包/框架来实现MVVM.它可以像这样简单...让我们假设我们有一个MainViewModel,PersonViewModel和一个CompanyViewModel,每个都有自己的相关视图,每个都扩展了一个abstract基类BaseViewModel.

BaseViewModel,我们可以添加公共属性和/或ICommand实例并实现INotifyPropertyChanged接口.因为它们都扩展了BaseViewModel类,所以我们可以在MainViewModel类中拥有可以设置为任何视图模型的属性:

public BaseViewModel ViewModel { get; set; }
Run Code Online (Sandbox Code Playgroud)

当然,你会实现INotifyPropertyChanged正确的接口不像这个简单的例子性能.现在App.xaml,我们声明一些简单的DataTemplates来连接视图与视图模型:

<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
    <Views:MainView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:PersonViewModel}">
    <Views:PersonView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:CompanyViewModel}">
    <Views:CompanyView />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

现在,无论我们BaseViewModel在应用程序中使用其中一个实例,这些DataTemplate都将告诉框架显示相关视图.我们可以像这样显示它们:

<ContentControl Content="{Binding ViewModel}" />
Run Code Online (Sandbox Code Playgroud)

因此,我们现在需要做的就是切换到新视图是ViewModelMainViewModel类中设置属性:

ViewModel = new PersonViewModel();
Run Code Online (Sandbox Code Playgroud)

最后,我们如何从其他视图更改视图?那么有几种可能的方式做到这一点,但最简单的方法是添加Binding从子视图直接连接到ICommandMainViewModel.我使用的是自定义版本RelayComand,但你可以使用你喜欢的任何类型,我猜你会得到图片:

public ICommand DisplayPersonView
{
    get { return new ActionCommand(action => ViewModel = new PersonViewModel(), 
        canExecute => !IsViewModelOfType<Person>()); }
}
Run Code Online (Sandbox Code Playgroud)

在子视图XAML中:

<Button Command="{Binding DataContext.DisplayPersonView, RelativeSource=
    {RelativeSource AncestorType={x:Type MainView}}, Mode=OneWay}" />
Run Code Online (Sandbox Code Playgroud)

而已!请享用.

  • 好吧,如果你正在使用MVVM Light,那么你应该坚持使用他们用来做这些事情...我的观点是你不需要*使用框架来实现这个功能. (6认同)
  • 我不确定我是否真的理解你的问题@ ETG87.视图模型类只是扩展`BaseViewModel`类的类,视图只是`UserControl`. (4认同)
  • 老兄,你需要阅读[WPF XAML的XAML命名空间和命名空间映射](http://msdn.microsoft.com/en-us/library/ms747086(v = vs.110).aspx)... my视图在`AppName.Views`命名空间中声明,该命名空间具有映射的`Views`的XAML命名空间前缀.视图模型在`AppName.ViewModels`命名空间中声明,因此映射到`ViewModels`的XAML命名空间前缀.应该没有`BaseViewModel`命名空间,因为它是一个类,而不是一个命名空间. (3认同)
  • @Sheridan,我在我的应用程序中执行此操作,但即使我在代码中创建了 ViewModel 的新实例,XAML 代码也会创建另一个实例。有没有办法解决这个问题?我正在尝试切换视图并立即绑定到一个事件,但由于 XAML 创建了一个新实例,我无法实现它。 (2认同)
  • @AUSTX_RJL,如果你还没有,你应该问一个新的问题. (2认同)

msk*_*t86 7

当我第一次使用MVVM时,我也在努力使用不同的MVVM框架,特别是导航部分.因此,我使用我发现的这个小教程,即Rachel Lim创建的.这很好,很好解释.

在以下链接上查看它:

希望它能帮助你:)

  • 谢谢,但这不是我的意思.我将此示例用于另一个应用程序,但对于此应用程序,我没有侧面菜单.所以我在view1上有一个按钮,当我点击该按钮时,它必须切换到view2 (3认同)