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的好处是前者可以自动绑定,后者只能手动绑定
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;
}
}
}