关于Prism
prism相对于微软的Community.Toolkit.Mvvm功能更多,主要有导航、区域管理、模块、视图注入、视图模型定位,对话框等。
使用Prism
1、在NuGet上搜索Prism.DryIoc安装类库
2、App.xaml.cs类实现Prism.DryIoc.PrismApplication抽象类,重写CreateShell(初始化主窗口)、RegisterTypes(依赖注入)、InitializeShell(初始化Shell(主窗口)的时候执行这个方法)
3、编写viewmodel(实现BindableBase抽象类)、View
注意:Prism是可以自动监测view对应的viewmodel,前提是view放到Views文件夹和ViewModel放到ViewModels文件夹,并且视图命名xxxView,视图模型命名xxxViewModel
代码示例
项目使用的版本介绍
创建WPF核心项目,.net版本8.0
安装Prism.DryIoc9.0.537(使用8.0也可以,不过8.0App.xmal.cs配置回合9.0有所不同,关于8.0网上的案例很多,9.0的没多少。所以我主要是想分享一下9.0的使用经历)
安装Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Tools、Microsoft.EntityFrameworkCore.Design(这四个就是微软的EF框架用来简化ADO.net的),项目使用的是EF代码创建数据库,你可以修改连接数据库字符串使用PM里面的命令直接创建和我相同的数据库表。
我的数据库使用的是Sqlserver,当然你也可以用其他的比如Oracle、Mysql。
Model层
public class UserModel
{
/// <summary>
/// 用户表主键
/// </summary>
[Key]
[Comment("用户表主键")]
public int Id { get; set; }
/// <summary>
/// 账号
/// </summary>
[Column(TypeName = "varchar")]
[MaxLength(50)]
[Comment("账号")]
public required string Account { get; set; }
/// <summary>
/// 密码
/// </summary>
[Column(TypeName = "varchar")]
[MaxLength(50)]
[Comment("密码")]
public required string Password { get; set; }
/// <summary>
/// 昵称
/// </summary>
[Column(TypeName = "varchar")]
[MaxLength(50)]
[Comment("昵称")]
public required string Nick { get; set; }
/// <summary>
/// 头像
/// </summary>
[Column(TypeName = "image")]
[Comment("头像")]
public byte[]? ProfilePicture { get; set; }
/// <summary>
/// 手机号
/// </summary>
[Column(TypeName = "varchar")]
[MaxLength(50)]
[Comment("手机号")]
public required string Phone { get; set; }
/// <summary>
/// 邮箱
/// </summary>
[Column(TypeName = "varchar")]
[MaxLength(50)]
[Comment("邮箱")]
public string? Email { get; set; }
/// <summary>
/// 是否逻辑删除
/// </summary>
[Column(TypeName = "int default 0")]
[Comment("是否逻辑删除(0未删除、1删除)")]
public int IsDel { get; set; } = 0;
/// <summary>
/// 创建时间
/// </summary>
[Column(TypeName = "datetime default getdate()")]
[Comment("创建时间默认当前时间")]
public DateTime CreateTime { get; set; } = DateTime.Now;
/// <summary>
/// 修改时间
/// </summary>
[Column(TypeName = "datetime")]
[Comment("修改时间")]
public DateTime? UpdateDate { get; set; } = DateTime.Now;
MyContext配置EF
public class MyContext : DbContext
{
public MyContext()
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//需要修改成你的数据库用户名和密码
string connstring = "data source = .;Initial Catalog = PrismDemoes;user id = sa;password = root;Trusted_Connection=True;Encrypt=false;";
optionsBuilder.UseSqlServer(connstring);
base.OnConfiguring(optionsBuilder);
}
public virtual DbSet<UserModel> UserModel { get; set; }
}
PM命令创建数据库
打开PM命令,启用数据迁移Add-Migration打个回车,然后输入Name、添加迁移版本Add-Migration 版本名称、更新数据库Update-Database
Iservice接口层
public interface IUserService
{
List<UserModel> FindByEF();
}
service接口实现层
public class UserService : IUserService
{
public List<UserModel> FindByEF()
{
using var command = new MyContext();
var query = from rows in command.UserModel select rows;
return query.ToList();
}
}
ViewModel层
public class ViewAViewModel : BindableBase
{
public List<UserModel> userModels { get; set; } = new List<UserModel>();
private readonly MyContext context;
public ViewAViewModel(IUserService userService)
{
//初始化集合用来保存数据
userModels = new List<UserModel>();
//调用service方法给集合赋值
userModels = userService.FindByEF();
}
}
}
View层
在窗体头部加上这两行代码
引入prism命名空间
xmlns:prism="http://prismlibrary.com/"
自动读取ViewModel
prism:ViewModelLocator.AutoWireViewModel="True"
<Canvas>
<DataGrid
Canvas.Left="25"
Canvas.Top="119"
Width="630"
Height="212"
HorizontalAlignment="Left"
VerticalAlignment="Top"
AutoGenerateColumns="False"
IsReadOnly="True"
ItemsSource="{Binding userModels}">
<DataGrid.Columns>
<DataGridTextColumn
Width="100"
Binding="{Binding Id}"
Header="Id" />
<!--自行添加展示的字段-->
<DataGridTextColumn />
<DataGridTextColumn />
<DataGridTextColumn />
<DataGridTextColumn />
<DataGridTextColumn />
<DataGridTextColumn />
<DataGridTemplateColumn Header="操作">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<WrapPanel>
<Button Content="修改" />
<Button Content="删除" />
</WrapPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Canvas>
App.xaml写法
<prism:PrismApplication
x:Class="ErpMesPrismSystem.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ErpMesPrismSystem"
xmlns:prism="http://prismlibrary.com/"
StartupUri="MainWindow.xaml">
<Application.Resources />
</prism:PrismApplication>
App.xaml.cs写法
public partial class App : Prism.DryIoc.PrismApplication
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
/*protected override void OnInitialized()
{
base.OnInitialized();
}*/
protected override void InitializeShell(Window shell)
{
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
//主窗体
containerRegistry.Register<MainWindow>();
//依赖注入
containerRegistry.Register<IUserService, UserService>();
}
}