WPF Prism框架(MVVM)

Prism简介

Modules:Modules是能够独立开发、测试、部署的功能单元,Modules可以被设计成实现特定业务逻辑的模块(如Profile Management),也可以被设计成实现通用基础设施或服务的模块(如Logging、Exception Management)。
ModuleCatalog:在Prism中,Module Catalog指明了要Load哪些Module,和用什么样的顺序去Load这些Module。
Shell:Shell是宿主应用程序(host application),modules将会被load到Shell中。Shell定义了应用程序的整体布局和结构,而不关心寄宿其中的Module,Shell通常实现通用的application service和infrastructure,而应用的逻辑则实现在具体的Module中,同时,Shell也提供了应用程序的顶层窗口。
Views:Views是应用中展现特定功能的视图,它展现UI、定义交互行为,并且通过数据绑定的方式与ViewModel进行交互。
ViewModel和Presenters:View Model用来封装应用程序的UI逻辑及其状态。
Model:Model被用来封装数据和相应的验证,以及相关的业务规则来保证数据的一致性和正确性。
Commands:Command被用来封装应用程序功能,Prism提供了DelegateCommand和CompositeCommand两个类。
Regions(区域):Regions是应用程序UI的逻辑区域,它很像一个PlaceHolder,Views在Regions中展现,很多种控件可以被用作Region:ContentControl、ItemsControl、ListBox、TabControl。Views能在Regions编程或者自动呈现,Prism也提供了Region导航的支持。

MVVM简介

MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。

MVC三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。
三层架构区分层次的目的是为了“高内聚,低耦合”。开发人员分工更明确,将精力更专注于应用系统核心业务逻辑的分析、设计和开发,加快项目的进度,提高了开发效率,有利于项目的更新和维护工作。
一、 界面层(UI)
界面层提供给用户一个视觉上的界面,通过界面层,用户输入数据、获取数据。界面层同时也提供一定的安全性,确保用户不用看到不必要的机密信息。
二、 逻辑层(BLL)
逻辑层是界面层和数据层的桥梁,它响应界面层的用户请求,执行任务并从数据层抓取数据,并将必要的数据传送给界面层。
三、 数据层(DAL)
数据层定义、维护数据的完整性、安全性,它响应逻辑层的请求,访问数据。

MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。

MVVM即模型-视图-视图模型。模型指的是后端传递的数据;视图指的是所看到的页面。视图模型是mvvm模式的核心,它是连接view和model的桥梁。它有两个方向:一是将模型转化成视图,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将视图转化成模型,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。

在此之前,WPF一般使用MVVMLight(已废弃)程序包来引进MVVM框架,之后利用microsoft toolkit mvvm(已废弃),现在常使用CommunityToolkit.Mvvm或者Prism来引入MVVM框架

引入Prism框架要使用Prism.DryIoc.Forms程序包

在App.xaml命名空间中添加prism依赖:xmlns:prism="http://prismlibrary.com/"。将App.xaml文件中的Application标签修改成为 prism:PrismApplication  。(wfp项目应用的是Application对象,使用prism框架的项目应用的是PrismApplication。Application对象如何启动主页面, StartupUri, PrismApplication启动主页面可以靠StartupUri(可删去),也可不需要,推荐使用App .xaml.cs中CreateShell()方法中的依赖注入)

<prism:PrismApplication x:Class="PrismDemo.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:PrismDemo"
             xmlns:prism="http://prismlibrary.com/">
    <Application.Resources>
    </Application.Resources>
</prism:PrismApplication>


创建Views和ViewModels文件夹,将项目创建时自动创建的MainWindow.xaml视图文件,移动到Views文件夹下(别忘了修改MainWindow.xaml和MainWindow.xaml.cs中的命名空间,要加上.Views)
 

<Window x:Class="Demo1.MainWindow"></Window>
修改为:
<Window x:Class="Demo1.Views.MainWindow"></Window>
修改App.xaml.cs继承的类,将继承的Window类改成PrismApplication类,实现PrismApplication类中的CreateShell()方法和RegisterTypes()方法
namespace PrismDemo
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : PrismApplication
    {
        // 关系:PrismApplication 继承于 PrismApplicationBase 继承于 Application
        // 快捷键:查看对象源码:fn+f12,快速实现接口,方法,抽象类:alt+enter+enter
        // 快速创建构造函数:ctor
 
        // Window窗体, StartupUri可以启动一个窗体
        // CreateShell()主要负责启动一个主页面。Main
        protected override Window CreateShell()
        {
            // 启动一个窗体MainWindow
            return Container.Resolve<Main>();
        }
 
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
        }
       
    }
}

Prism用来实现MVVM比CommunityToolkit.Mvvm的好处是前者可以自动绑定,后者只能手动绑定

扫描二维码关注公众号,回复: 16884555 查看本文章

Prism自动绑定需满足的条件:

  • 窗体|页面|用户控件必须放到Views文件夹下
  • 模型必须放到ViewModels文件夹下
  • 模型名称的名称,必须是窗体名称开头,且以ViewModel结尾

 

 xaml内代码:

<Window x:Class="PrismWpf.Views.a"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:PrismWpf.Views"
      xmlns:prism="http://prismlibrary.com/"
      prism:ViewModelLocator.AutoWireViewModel="True"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      Title="a">

    <Grid>
        <TextBlock Text="a页面"/>
        <TextBlock Width="50" Height="50" Text="{Binding Age}"  FontSize="20"/>
    </Grid>
</Window>

ViewModel内代码:

namespace PrismWpf.ViewModels
{
    public class aViewModel 
    {
        private int _id;
        public int Age
        {
            get
            {
                return _id;
            }
            set
            {
                _id = value;
             
            }
        }

        aViewModel()
        {
            Age = 50;
        }
    }
}

手动绑定要在a.xaml.cs添加aViewModel的实例化,并将数据上下文与之绑定

namespace PrismWpf.Views
{
    /// <summary>
    /// a.xaml 的交互逻辑
    /// </summary>
    public partial class a : Window
    {
        public a()
        {
            InitializeComponent();
            aViewModel aViewModel = new aViewModel();
            this.DataContext = aViewModel;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_57212959/article/details/131995061