简介
模型-视图-视图模型(MVVM)模式帮助我们将应用程序的业务和表示逻辑与其用户界面(UI)清晰地分离。在应用程序逻辑和UI之间保持清晰的分离有助于解决许多开发和设计问题,并使我们的应用程序更易于测试、维护和拓展。它还可以极大地改善代码重用机会,并允许开发人员和UI设计人员在开发各自的应用程序部分时更轻松地协作。 使用MVVM模式,应用程序的UI以及底层的表示和业务逻辑被分为三个独立的类:视图,它封装了UI和UI逻辑;视图模型,封装表示逻辑和状态;以及封装应用程序的业务逻辑和数据的模型。
Prism提供了将视图(View)和视图模型(ViewModel)自动绑定的机制,即将ViewModel的实例赋值给View的DataContext属性
<Window x:Class="Demo.Views.MainWindow" ... xmlns:prism="http://prismlibrary.com/" prism:ViewModelLocator.AutoWireViewModel="False">ViewModelLocator 类提供了附加属性 AutoWireViewModel,当设置为true时,调用ViewModelLocationProvider类中的AutoWireViewModelChanged方法来解析视图的ViewModel,然后将视图的数据上下文设置为该ViewModel的实例。 自动绑定规则:
- 视图和视图模型在同一程序集下
- ViewModel位于ViewModels名称空间下
- View位于Views名称空间下
- ViewModel类名 = View类名 + “ViewModel”
自定义绑定规则
App.xaml.cs中重写ConfigureViewModelLocator方法protected override void ConfigureViewModelLocator() { base.ConfigureViewModelLocator(); ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) => { var viewName = viewType.FullName.Replace(".ViewModels.", ".CustomNamespace."); var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName; var viewModelName = $"{viewName}ViewModel, {viewAssemblyName}"; return Type.GetType(viewModelName); }); }
自注册具体绑定,适用于部分绑定不遵循规范
Type / TypeViewModelLocationProvider.Register(typeof(MainWindow).ToString(), typeof(CustomViewModel));Type / Factory
ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), () => Container.Resolve<CustomViewModel>());Generic Factory
ViewModelLocationProvider.Register<MainWindow>(() => Container.Resolve<CustomViewModel>());Generic Type
ViewModelLocationProvider.Register<MainWindow, CustomViewModel>();