一、目的:开发过程中经常会修改和查看一个Model的数据,一般情况下会自定义一个控件或Window去显示Model数据,但这种数据如果比较多会增加很多开发工作,本文介绍一种通用的方式,应用表达Form控件去简化处理,通常下只需在Model的Property属性上增加一些特性即可定制显示的表单信息和验证信息。
二、实现
显示效果如下
三、环境
VS2022 Net7
四、使用方式
1、安装nuget包:H.Modules.Messages.Dialog和H.Modules.Messages.Form
首先,定义一个实体Model
public class Student
{
[Display(Name = "姓名", GroupName = "基础信息")]
[Required]
public string Name { get; set; }
[Display(Name = "班级", GroupName = "基础信息")]
[Required]
public string Class { get; set; }
[Display(Name = "地址", GroupName = "基础信息")]
[Required]
public string Address { get; set; }
[Display(Name = "邮箱", GroupName = "基础信息")]
[Required]
public string Emall { get; set; }
[Display(Name = "可用", GroupName = "其他信息")]
[Required]
public bool IsEnbled { get; set; }
[Display(Name = "时间", GroupName = "其他信息")]
[Required]
public DateTime Time { get; set; }
[Display(Name = "年龄", GroupName = "基础信息")]
[Required]
public int Age { get; set; }
[Display(Name = "分数", GroupName = "成绩信息")]
[Range(0.0, 150.0)]
public double Score { get; set; }
[Display(Name = "电话号码", GroupName = "基础信息")]
[Required]
[RegularExpression("^1[3|4|5|7|8][0-9]{9}$", ErrorMessage = "手机号码不合法!")]
public string Tel { get; set; }
}
之后,调用表单控件显示
var student = new Student();
await AdornerDialog.ShowPresenter(new StaticFormPresenter(student));
通过以上步骤即可实现该效果,详细说明如下
1,修改Student的属性的[Display(Name = "电话号码", GroupName = "基础信息")]特性可以自定义表单上显示的名称;
2,如果想增加自定义验证规则可以修改属性的[RegularExpression("^1[3|4|5|7|8][0-9]{9}$", ErrorMessage = "手机号码不合法!")]等继承自从ValidationAttribute特性,比如这句就是验证电话号码是否合法的特性;
再修改执行代码如下:
Student student = new Student();
Func<bool> canSumit = () =>
{
if (student.ModelStateDeep(out string error) == false)
{
IocMessage.Dialog.Show(error);
return false;
}
return true;
};
StaticFormPresenter presenter = new StaticFormPresenter(student);
await AdornerDialog.ShowPresenter(presenter, x =>
{
x.DialogButton = DialogButton.Sumit;
x.Title = "Form Dailog";
}, canSumit);
这时就会在提交时验证数据是否合法,当数据不合法时弹出异常信息,效果如下:
(注:验证数据这部分功能v1.0.1版本有问题,后面版本会修复)
显示查看详情信息代码如下:
Student student = new Student();
Func<bool> canSumit = () =>
{
if (student.ModelStateDeep(out string error) == false)
{
MessageBox.Show(error);
return false;
}
return true;
};
StaticFormPresenter presenter = new StaticFormPresenter(student);
presenter.UsePropertyView = true;
await AdornerDialog.ShowPresenter(presenter, x =>
{
x.DialogButton = DialogButton.None;
x.Title = "Form Dailog";
}, canSumit);
效果如下:
AdornerDailog部分参考文章:示例:推荐一个应用Adorner做的消息对话框-CSDN博客
五、需要了解的知识点
RegularExpressionAttribute 类 (System.ComponentModel.DataAnnotations) | Microsoft Learn
ValidationAttribute 类 (System.ComponentModel.DataAnnotations) | Microsoft Learn
DisplayAttribute 类 (System.ComponentModel.DataAnnotations) | Microsoft Learn
System.Windows.Controls 命名空间 | Microsoft Learn
六、源码地址
GitHub - HeBianGu/WPF-ControlDemo: 示例
GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库
GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库
七、了解更多
System.Windows.Controls 命名空间 | Microsoft Learn
https://github.com/HeBianGu
HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频