WPF Prism的ViewModelLoctor对象个性化匹配、IOC、事件聚合器

Prism的ViewModelLoctor对象个性化匹配、IOC、事件聚合器

  1. 更改命名约定

    设计思路:

    1. 利用视图的类型全名称,将其中Views替换成ViewModels

    2. 检查类型是不是以View结尾

    3. 最终返回一个ViewModel的类型

      新建文件夹/窗口【ViewTest/MainWindow.xaml】,代码如下:

      <Window x:Class="WpfApp6.ViewTest.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:local="clr-namespace:WpfApp6.ViewTest"
             xmlns:prism="http://prismlibrary.com/"
              prism:ViewModelLocator.AutoWireViewModel="true"
              mc:Ignorable="d"
              Title="MainWindow" Height="450" Width="800">
          <Grid>
              <StackPanel>
                  <TextBlock Text="您好"></TextBlock>
                  <TextBlock Text="{Binding Value}"></TextBlock>
              </StackPanel>
          </Grid>
      </Window>
      

      ​ 新建文件夹/类【ViewModelTest/MainViewModel】,代码如下:

      using Prism.Mvvm;
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace WpfApp6.ViewModelTest
      {
          public  class MainViewModel:BindableBase 
          {
              private string  _value = "Hellow Word"; 
              public string  Value
              {
                  get { return _value; }
                  set { 
                  SetProperty(ref _value, value);
                  }
              }
      
          }
      }
      

      App.xaml.cs 代码新增重写方法:【ConfigureViewModelLocator】 来配置个性化规则

      using Prism.Ioc;
      using Prism.Mvvm;
      using Prism.Unity;
      using System;
      using System.Collections.Generic;
      using System.Configuration;
      using System.Data;
      using System.Linq;
      using System.Threading.Tasks;
      using System.Windows;
      
      namespace WpfApp6
      {
          /// <summary>
          /// Interaction logic for App.xaml
          /// </summary>
          public partial class App : PrismApplication
          {
              protected override Window CreateShell()
              {
                   return  Container.Resolve<ViewTest.MainWindow>();   
              }
      
              protected override void RegisterTypes(IContainerRegistry containerRegistry)
              {
                   
              }
              /// <summary>
              /// 配置ViewModelLocator的匹配规则 
              /// </summary>
              protected override void ConfigureViewModelLocator()
              { 
                  ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((t) => {
                      //参数  t:需要匹配的视图
                      //返回需要匹配的ViewModel的类型 
                      var viewName = t.FullName;
                      var vmName = viewName.Replace(".ViewTest.", ".ViewModelTest.");
                      if (vmName.EndsWith("Window"))
                          vmName = vmName.Substring(0, vmName.Length - 6);
                      if (vmName.EndsWith("View"))
                          vmName += "Model";
                      else
                          vmName += "ViewModel";
                      return Type.GetType(vmName);
                  });
              } 
          }
      }
      
  2. 独立注册–4种方式

    场景:

    • 三不搭情况下:
    1. 可能不在一个程序集

    2. 对象不在指定的目录

    3. 名称不匹配

      解决方案为:独立注册,有四种方式

      1. 临时注册某一个关系对象

        新建文件夹:【ViewTest/DemoWin.xaml】,实例代码如下:

        <Window x:Class="WpfApp6.ViewTest.DemoWin"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                xmlns:prism="http://prismlibrary.com/"
                prism:ViewModelLocator.AutoWireViewModel="True"
                xmlns:local="clr-namespace:WpfApp6.ViewTest"
                mc:Ignorable="d"
                Title="DemoWin" Height="450" Width="800">
            <Grid>
                <TextBlock Text="{Binding Value}"></TextBlock>
            </Grid>
        </Window>
        

        新建文件夹:【ViewModelTest/DemoViewModel.cs】,代码如下:

        using Prism.Ioc;
        using Prism.Mvvm;
        using Prism.Unity;
        using System;
        using System.Collections.Generic;
        using System.Configuration;
        using System.Data;
        using System.Linq;
        using System.Threading.Tasks;
        using System.Windows;
        
        namespace WpfApp6
        {
            /// <summary>
            /// Interaction logic for App.xaml
            /// </summary>
            public partial class App : PrismApplication
            {
                protected override Window CreateShell()
                {
                     return  Container.Resolve<ViewTest.DemoWin>();   
                }
        
                protected override void RegisterTypes(IContainerRegistry containerRegistry)
                {
                     
                }
                /// <summary>
                /// 配置ViewModelLocator的匹配规则 
                /// </summary>
                protected override void ConfigureViewModelLocator()
                { 
                    //临时注册某一个关系对象
                    //1 类型对接类型   ViewModelLocationProvider.Register(typeof(ViewTest.DemoWin).ToString(),typeof(ViewModelTest.DemoViewModel));
                } 
            }
        }
        
      2. 类型 对接 工厂

          protected override void ConfigureViewModelLocator()
                { 
                    //2 类型 对接 工厂
                    ViewModelLocationProvider.Register(typeof(ViewTest.DemoWin).ToString(),()=>
                    {
                     return Container.Resolve<ViewModelTest.DemoViewModel>();
                    });
                } 
        
      3. 通用工厂

       protected override void ConfigureViewModelLocator()
           {
             //3  通用工厂
             ViewModelLocationProvider.Register<ViewTest.DemoWin>(() => {
                      return Container.Resolve<ViewModelTest.DemoViewModel>();
                  });
          } 
      
      1. 泛型类型

         /// <summary>
                /// 配置ViewModelLocator的匹配规则 
                /// </summary>
                protected override void ConfigureViewModelLocator()
                { 
                    //4  泛型类型
                    ViewModelLocationProvider.Register<ViewTest.DemoWin,ViewModelTest.DemoViewModel>();
                } 
        
  3. IOC思想的应用与业务逻辑

    Prism.Unity框架中自带了类对象注册的方法,在App.xaml.cs中的 RegisterTypes 方法,实例代码如下:

             /// <summary>
            /// IOC容器对象的注册
            /// </summary>
            /// <param name="containerRegistry"></param>
            protected override void RegisterTypes(IContainerRegistry containerRegistry)
            {
                containerRegistry.Register<IDataAccess, DataAccess>();
            }
    

    新建接口类与实现类,代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace WpfApp6.DAL
    {
        public class DataAccess : IDataAccess
        {
           
            public string GetData()
            {
                return "世界和平!";
            }
        }
    }
    
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace WpfApp6.DAL
    {
      public  interface IDataAccess
        {
            string GetData();
        }
    }
    

    DemoViewModel代码如下:

    using Prism.Mvvm;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using WpfApp6.DAL;
    
    namespace WpfApp6.ViewModelTest
    {
        public class DemoViewModel : BindableBase
        {
       
            private string _value="世界和平!";
    
            public string Value
            {
                get { return _value; }
                set
                {
                    SetProperty(ref _value, value);
                }
            }
            //  构造函数注入
           // public DemoViewModel(IDataAccess _data)
          //  {
            //  this.Value =  _data.GetData();
          //  }
          //属性注入
          [Dependency]
          private IDataAccess _data{get;set;}
        }
    }
    
  4. 事件聚合器 【发布 订阅】
    • 条件:

      1、注入一个IEvevtAggragator
      2、新建一个事件类并处理消息
    • 代码实现如下

      MainWindowViewModel类

      using Prism.Commands;
      using Prism.Events;
      using Prism.Mvvm;
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Windows.Input;
      using WpfApp7.Dal;
      using WpfApp7.Events;
      
      namespace WpfApp7.ViewModels
      {
          public class MainWindowViewModel : BindableBase
          {
              private string _value = "世界和平!";
              private readonly IEventAggregator eventAgs;
              public string Value
              {
                  get { return _value; }
                  set
                  {
                      SetProperty(ref _value, value);
                  }
              }
       
              public MainWindowViewModel(IDataAccess da, IEventAggregator _eventAgs)
              {
                  //订阅一个事件
                  eventAgs = _eventAgs;
                  eventAgs.GetEvent<MessageEvent>().Subscribe((o) => {
                      this.Value = o.ToString();
                  });
              }
              /// <summary>
              /// 生产者  发布事件
              /// </summary>
              public ICommand Btn_Send
              {
                  get => new DelegateCommand<object>((p) =>
                  {
                      eventAgs.GetEvent<MessageEvent>().Publish(p);
                  });
              }
          }
      }
      //备注:
          //Subscribe  参数
            //第一个参数为:订阅者的执行Action
            //第二个参数为:ThreadOption  订阅者使用哪个线程来处理事件。
                         //是个枚举 
                         //.PublisherThread  发布者的执行线程   默认
                         //.BackgroundThread  不管在哪个线程发布  这里的Action都在后台线程处理
                         //.UIThread   不管在哪个线程发布 这里的Action都在UI线程处理
            //第三个参数 是个bool类型  是个开关  默认为 false 
            //第四个参数  Predicate<TPayload> filter  过滤器  
      

      新建事件类:Events/MessageEvent 并继承 PubSubEvent object是为传递的参数

      using Prism.Events;
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace WpfApp7.Events
      {
          /// <summary>
          /// 定义一个事件类
          /// </summary>
          public class MessageEvent:PubSubEvent<object>
          {
          }
      }
      

      MainWindow.xaml 代码如下:

      <Window x:Class="WpfApp7.Views.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:local="clr-namespace:WpfApp7.Views"
              xmlns:prism="http://prismlibrary.com/"
              prism:ViewModelLocator.AutoWireViewModel="True"
              mc:Ignorable="d"
              Title="MainWindow" Height="450" Width="800">
          <Grid>
              <StackPanel> 
                  <Button Content="生产者" Command="{Binding Btn_Send}" CommandParameter="123"></Button>
                  <TextBlock Text="{Binding Value}" ></TextBlock>
              </StackPanel>
          </Grid>
      </Window>
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF Prism文档是指关于Prism框架的详细说明和使用指南的文件集。Prism是一种基于WPF(Windows Presentation Foundation)的开发框架,它旨在帮助开发人员设计和构建复杂的、可扩展的企业级WPF应用程序。 WPF Prism文档通过提供清晰的指导和实例,帮助开发人员学习和理解如何正确地使用Prism框架。这些文档通常包含Prism框架的基本概念、设计模式和最佳实践。在这些文档中,开发人员可以了解到如何将应用程序分解为模块,如何使用依赖注入来管理应用程序的组件和模块之间的依赖关系,以及如何使用事件聚合进行模块间的通信等等。 此外,WPF Prism文档还提供大量的示例代码和实用的代码片段,帮助开发人员快速理解和运用Prism框架的功能。这些示例代码涵盖了Prism框架各个方面的应用,包括注册模块、导航和区域管理、命令和互动、模块间通信等等,以满足不同开发需求的应用程序场景。 通过阅读WPF Prism文档,开发人员可以更好地理解Prism框架的核心概念和设计原则,从而更高效地构建可维护、可扩展的WPF应用程序。这些文档也可以作为学习和培训的参考资料,帮助新手快速入门,并且帮助有经验的开发人员进一步提升他们的技术水平。 总之,WPF Prism文档是一份宝贵的资源,为开发人员提供了全面的指导和实例,帮助他们掌握和运用Prism框架,以构建高质量的WPF应用程序。 ### 回答2: WPF Prism文档是指Prism开源框架的相关文档。Prism是一种用于构建模块化、可扩展、高效、可测试且易于维护的WPF应用程序的框架。Prism的文档提供了详细的指导和说明,帮助开发人员快速上手并正确地使用Prism框架。 WPF Prism文档通常包含以下内容:框架的介绍和概述,包括它的设计理念、优势以及使用场景;安装和配置指南,指导开发人员如何在他们的项目中引入和配置Prism;架构和模块化概念的介绍,帮助开发人员理解Prism框架的核心思想;关于如何创建和组织模块的指导,包括如何定义和加载模块,如何使用导航和呈现模块的方式等;还包括关于依赖注入、命令和事件聚合等核心概念的详细解释和用法示例。 此外,WPF Prism文档还通常包含一些实用的示例代码,以帮助开发人员更好地理解和运用框架的特性和功能。这些示例可以涵盖从简单的模块创建到复杂的UI导航和模块通信的各个方面。 总而言之,WPF Prism文档通过提供详细的指南、解释和示例代码,帮助开发人员了解和使用Prism框架,以便有效地构建出高质量、可维护和可扩展的WPF应用程序。 ### 回答3: WPF Prism文档是Prism框架的官方文档,用于帮助开发人员理解和使用Prism框架。Prism是一个用于开发模块化、可扩展和可重用的WPF应用程序的开源框架。 WPF Prism文档包含了Prism框架的完整说明和指南,涵盖了框架的核心概念、设计原则和使用方法。文档详细介绍了Prism框架的各个组件,如模块化、导航、命令、事件聚合等,并提供了示例代码和详细解释,帮助开发人员快速上手和理解框架。 在WPF Prism文档中,开发人员可以了解到Prism框架的优点和适用场景,了解如何将Prism集成到自己的WPF应用程序中,并利用框架提供的功能和工具来简化开发过程。文档还介绍了Prism的相关概念和模式,如依赖注入、解耦和松耦合等,帮助开发人员遵循最佳实践和设计原则,构建出高质量和可维护的应用程序。 除了框架的详细说明和指南,WPF Prism文档还包含了一些常见问题和解决方案,帮助开发人员解决在使用Prism框架时遇到的困难和问题。文档还提供了一些扩展和相关资源的链接,帮助开发人员深入学习和探索Prism框架的更多功能和扩展。 总之,WPF Prism文档是Prism框架的权威指南,对于希望使用Prism框架开发WPF应用程序的开发人员来说,它是一个不可或缺的参考资料。通过学习和理解WPF Prism文档,开发人员能够更加高效和灵活地开发出优秀的WPF应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值