zoukankan      html  css  js  c++  java
  • Prism_ViewModelLocator(5)

    ViewModelLocator

    ViewModelLocator用于绑定视图的DataContext,以使用标准命名约定的一个ViewModel的实例。

    Prism ViewModelLocator有一个AutoWireViewModel附加属性,当设置为true调用类中的AutoWireViewModelChanged方法ViewModelLocationProvider来解析视图的ViewModel时,然后将视图的数据上下文设置为该ViewModel的实例。

    AutoWireViewModel附加属性添加到每个视图:

    <Window x:Class="Demo.Views.MainWindow"
        ...
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True">
    

    要查找ViewModel,ViewModelLocationProvider首先尝试从ViewModelLocationProvider.Register方法注册的任何映射中解析ViewModel (请参阅自定义ViewModel注册)。如果使用此方法无法解析ViewModel,则会ViewModelLocationProvider回退到基于约定的方法来解析正确的ViewModel类型。

    该惯例假定:

    • ViewModel与视图类型位于同一个程序集中
    • ViewModel位于.ViewModels子命名空间中
    • 视图位于.Views子命名空间中
    • ViewModel名称与视图名称对应,以“ViewModel”结尾。

    注意

    ViewModelLocationProvider可以在发现Prism.Mvvm命名空间中的Prism.Core NuGet包。本ViewModelLocator可以在发现Prism.Mvvm命名空间中的Prism.WPF NuGet包。

    注意

    ViewModelLocator是必需的,并且在使用Xamarin.Forms进行开发时会自动应用于每个View,因为它负责向INavigationServiceViewModel 提供正确的实例。在开发Xamarin.Forms应用程序时,ViewModelLocator只能选择退出。

    视频教程1

    [Using the ViewModelLocator视频教程](Prism.assets/Prism - Using the ViewModelLocator.mp4)

    更改命名约定

    如果您的应用程序不遵循ViewModelLocator默认命名约定,则可以更改约定以满足应用程序的要求。本ViewModelLocationProvider类提供了一个称为静态方法SetDefaultViewTypeToViewModelTypeResolver,可以用来提供自己的约定关联视图查看模型。

    要更改ViewModelLocator命名约定,请覆盖类中的ConfigureViewModelLocator方法App.xaml.cs。然后在ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver方法中提供自定义命名约定逻辑。

    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);
        });
    }
    

    视频教程2

    [Changing the ViewModelLocator Naming Convention视频教程](Prism.assets/Prism - Changing the ViewModelLocator Naming Convention.mp4)

    自定义ViewModel注册

    可能存在您的应用程序遵循ViewModelLocator默认命名约定的情况,但您有许多不符合约定的ViewModel。您可以ViewModelLocator使用该ViewModelLocationProvider.Register方法直接将ViewModel的映射注册到特定视图,而不是尝试自定义命名约定逻辑以有条件地满足所有命名要求。

    以下示例显示了在名为MainWindow的ViewModel和ViewModel 之间创建映射的各种方法CustomViewModel

    类型/类型

    ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), typeof(CustomViewModel));
    

    类型/工厂

    ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), () => Container.Resolve<CustomViewModel>());
    

    通用工厂

    ViewModelLocationProvider.Register<MainWindow>(() => Container.Resolve<CustomViewModel>());
    

    通用类型

    ViewModelLocationProvider.Register<MainWindow, CustomViewModel>();
    
    注意

    直接注册ViewModel ViewModelLocator比依赖默认命名约定更快。这是因为命名约定需要使用反射,而自定义映射直接提供类型ViewModelLocator

    重要

    viewTypeName参数必须是视图的Type(Type.ToString())的完全限定名称。否则映射将失败。

    视频教程3

    [ViewModelLocator Custom Registrations视频教程](Prism.assets/Prism - ViewModelLocator Custom Registrations.mp4)

    控制ViewModel的解析方式

    默认情况下,ViewModelLocator将使用您选择的DI容器来创建Prism应用程序以解析ViewModels。但是,如果您需要自定义ViewModel的解析方式或完全更改解析器,则可以使用该ViewModelLocationProvider.SetDefaultViewModelFactory方法实现此目的。

    此示例显示如何更改用于解析ViewModel实例的容器。

    protected override void ConfigureViewModelLocator()
    {
        base.ConfigureViewModelLocator();
    
        ViewModelLocationProvider.SetDefaultViewModelFactory(viewModelType) =>
        {
            return MyAwesomeNewContainer.Resolve(viewModelType);
        });
    }
    

    这是一个示例,说明如何检查为其创建ViewModel的视图类型,以及执行逻辑来控制ViewModel的创建方式。

    protected override void ConfigureViewModelLocator()
    {
        base.ConfigureViewModelLocator();
    
        ViewModelLocationProvider.SetDefaultViewModelFactory((view, viewModelType) =>
        {
            switch (view)
            {
                case Window window:
                    //your logic
                    break;
                case UserControl userControl:
                    //your logic
                    break;
            }
    
            return MyAwesomeNewContainer.Resolve(someNewType);
        });
    }
    
  • 相关阅读:
    【原创】QTP中手动添加对象
    【转载】【缺陷预防技术】流程技术预防
    【资料】HP Loadrunner 11下载地址
    使用命令行操作VSS
    sql server 按时间段查询记录的注意事项
    Asp.net应用程序文件名重名引起的bug
    使用SQL语句查询表中重复记录并删除
    backgroundpositionx的兼容性问题
    关于Asp.net Development Server
    如何查看正在使用某个端口的应该程序
  • 原文地址:https://www.cnblogs.com/lovexinyi/p/11068981.html
Copyright © 2011-2022 走看看