C# WPF 中使用Prism

关于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>
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
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>();
	}
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
项目结构示意图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值