首先,您不需要使用任何工具包/框架来实现MVVM。它可以像这样简单...假设我们有一个名为
MainViewModel
的视图模型,以及一个名为
PersonViewModel
和一个名为
CompanyViewModel
的视图模型,每个视图模型都与其相关视图相关联,并扩展了
BaseViewModel
抽象基类。
在
BaseViewModel
中,我们可以添加公共属性和/或
ICommand
实例,并实现
INotifyPropertyChanged
接口。由于它们都扩展了
BaseViewModel
类,因此我们可以在
MainViewModel
类中拥有此属性,该属性可以设置为我们的任何视图模型之一:
public BaseViewModel ViewModel { get; set; }
当然,您会正确地在
您的属性上实现
INotifyPropertyChanged
接口,不像这个快速示例。现在,在
App.xaml
中,我们声明一些简单的
DataTemplate
来连接视图和视图模型:
<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>
现在,无论我们在应用程序中使用哪个BaseViewModel
实例,这些DataTemplate
都会告诉框架显示相关的视图。我们可以像这样显示它们:
现在,在我们的应用程序中使用任何一个BaseViewModel
实例时,这些DataTemplate
将指示框架显示相关视图。我们可以像下面这样显示它们:
<ContentControl Content="{Binding ViewModel}" />
现在,要切换到新视图,我们只需要从MainViewModel
类中设置ViewModel
属性:
ViewModel = new PersonViewModel()
最后,我们如何从其他视图更改视图?好吧,有几种可能的方法可以做到这一点,但最简单的方法是直接从子视图添加一个 Binding
到 MainViewModel
中的 ICommand
。我使用了 RelayComand
的自定义版本,但你可以使用任何你喜欢的类型,并且我猜你会明白:
public ICommand DisplayPersonView
{
get { return new ActionCommand(action => ViewModel = new PersonViewModel(),
canExecute => !IsViewModelOfType<Person>()); }
}
在子视图的XAML中:
<Button Command="{Binding DataContext.DisplayPersonView, RelativeSource=
{RelativeSource AncestorType={x:Type MainView}}, Mode=OneWay}" />
就是这样了!享受吧。