WPF点击提交按钮后验证

news/2025/2/8 20:43:39 标签: wpf, 开发语言

1.定义ValidateModelBase 基类,实现IDataErrorInfo接口来触发验证信息,

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using CommunityToolkit.Mvvm.ComponentModel;
 
   /// <summary>
   /// 验证模型基类
   /// </summary>
   public class ValidateModelBase : ObservableObject, IDataErrorInfo
   {
       public ValidateModelBase()
       {
           DataErrors = new Dictionary<string, string>();
       }

       #region 属性

       /// <summary>
       /// 表当验证错误集合
       /// </summary>
       public Dictionary<string, string>? DataErrors { get; private set; } = new Dictionary<string, string>();

       /// <summary>
       /// 是否验证通过
       /// </summary>
       public bool IsValidated
       {
           get
           {
               return DataErrors?.Count == 0;
           }
       }

       //是否允许验证
       private bool _shouldValidate = false;

       #endregion 属性

       public string this[string columnName]
       {
           get
           {
               if (!_shouldValidate)
                   return string.Empty;

               if (columnName == null) throw new ArgumentNullException(nameof(columnName));

               ValidationContext vc = new ValidationContext(this, null, null)
               {
                   MemberName = columnName
               };

               var res = new List<System.ComponentModel.DataAnnotations.ValidationResult>();

               var propertyInfo = this.GetType().GetProperty(columnName);
               if (propertyInfo == null)
               {
                   return string.Empty;
               }

               var value = propertyInfo.GetValue(this, null);
               bool result = Validator.TryValidateProperty(value, vc, res);

               if (res.Count > 0)
               {
                   string errorInfo = string.Join(Environment.NewLine, res.Select(r => r.ErrorMessage).ToArray());
                   AddDic(DataErrors, columnName, errorInfo);
                   return errorInfo;
               }

               RemoveDic(DataErrors, columnName);
               return string.Empty;
           }
       }

       public string Error => string.Empty;

       #region 附属方法

       /// <summary>
       /// 移除字典
       /// </summary>
       private void RemoveDic(Dictionary<string, string>? dics, string dicKey)
       {
           if (dics != null)
           {
               dics.Remove(dicKey);
           }
       }

       /// <summary>
       /// 添加字典
       /// </summary>
       private void AddDic(Dictionary<string, string>? dics, string dicKey, string dicValue)
       {
           if (dics != null && !dics.ContainsKey(dicKey))
           {
               dics.Add(dicKey, dicValue);
           }
       }

       #endregion 附属方法

       /// <summary>
       /// 执行验证
       /// </summary>
       /// <returns></returns>
       public bool Validate()
       {
           _shouldValidate = true;
           this.GetType().GetProperties()
           .Where(prop => prop.GetCustomAttributes(false)
           .Any(attr => attr.GetType().Namespace == typeof(RequiredAttribute).Namespace))
           .ToList().ForEach(p => OnPropertyChanged(p.Name));
           //  this.GetType().GetProperties().ToList().ForEach(p => OnPropertyChanged(p.Name));
           return IsValidated;
       }
   }

http://www.niftyadmin.cn/n/5845266.html

相关文章

降低获客与裂变渠道成本的新策略:融合开源2+1链动模式、AI智能名片与S2B2C商城小程序

摘要&#xff1a;在数字化时代&#xff0c;企业面临着日益增长的获客与裂变渠道成本挑战。本文提出了一种创新的策略&#xff0c;即通过融合开源21链动模式、AI智能名片以及S2B2C商城小程序&#xff0c;借助用户自身的社交网络&#xff0c;实现高效、低成本的获客拉新与裂变流量…

详细教程 | 如何使用DolphinScheduler调度Flink实时任务

Apache DolphinScheduler 非常适用于实时数据处理场景&#xff0c;尤其是与 Apache Flink 的集成。DolphinScheduler 提供了丰富的功能&#xff0c;包括任务依赖管理、动态调度、实时监控和日志管理&#xff0c;能够有效简化 Flink 实时任务的管理和部署。通过 DolphinSchedule…

C# Mutex 锁 使用详解

总目录 前言 在C#中&#xff0c;Mutex&#xff08;互斥锁&#xff09;是一种跨进程的同步机制&#xff0c;用于控制多个线程或进程对共享资源的访问。与 Monitor 和 lock 不同&#xff0c;Mutex 可以跨越进程边界进行同步&#xff0c;这使得它非常适合需要跨进程同步的场景。本…

MES系统对于中小型制造企业有什么价值?

由于近几年来我国制造业的飞速发展&#xff0c;催生出了很多为大企业代工或细分制造领域的中小型企业。这些中小型企业通常在初期因生产规模和资本的积累十分有限&#xff0c;所以在信息化投入方面较少。随着企业的发展需求&#xff0c;为应对多品种、小批量的制造模式在生产、…

1.1 画质算法的主要任务

文章目录 画质算法及分类画质问题的核心&#xff1a;退化 画质算法及分类 图像画质算法是指&#xff0c;处理图像或视频数字信号&#xff0c;以提高其视觉质量、人眼感官的算法。图像画质算法可分为&#xff1a;去噪&#xff08;Denoising), 超分辨率&#xff08;Super-Resolut…

消息队列高手课总结笔记——基础篇速通

第一章&#xff0c;整体认识 一&#xff0c;解决的问题&#xff08;使用场景&#xff09; 主要&#xff1a; 1&#xff0c;异步处理 2&#xff0c;流量控制 3&#xff0c;服务解耦 补充&#xff1a; 1&#xff0c;作为发布/订阅系统实现一个微服务级系统间的观察者模式&#…

202412 青少年软件编程等级考试C/C++ 二级真题答案及解析

第 1 题 逆行 题目描述 网上有个段子说&#xff1a;妻子在家听广播&#xff0c;听到某高速路上有一辆车在逆行&#xff0c;想到丈夫在那条高速上行驶&#xff0c;就打电话对丈夫说&#xff1a;“老公啊&#xff0c;你走的那条高速上有一辆车在逆行&#xff0c;你小心点。”她丈…

java手动实现常见数据结构

在 Java 中&#xff0c;常用的数据结构可以通过 集合框架&#xff08;Collections Framework&#xff09; 实现&#xff0c;也可以手动实现。以下是常见数据结构及其特点&#xff0c;以及对应的 Java 实现示例&#xff1a; 1. 数组&#xff08;Array&#xff09; 特点&#xf…