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)
因此,我们现在需要做的就是切换到新视图是ViewModel从MainViewModel类中设置属性:
ViewModel = new PersonViewModel();
Run Code Online (Sandbox Code Playgroud)
最后,我们如何从其他视图更改视图?那么有几种可能的方式做到这一点,但最简单的方法是添加Binding从子视图直接连接到ICommand的MainViewModel.我使用的是自定义版本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时,我也在努力使用不同的MVVM框架,特别是导航部分.因此,我使用我发现的这个小教程,即Rachel Lim创建的.这很好,很好解释.
在以下链接上查看它:
希望它能帮助你:)