首页 > 其他分享 >WPF表单验证

WPF表单验证

时间:2024-12-10 16:20:43浏览次数:12  
标签:return string 验证 get value 表单 WPF null public

利用Validator.TryValidateProperty方法以及IDataErrorInfo实现

XML代码如下 

<Grid>
    <Slider VerticalAlignment="Bottom" Minimum="0" Maximum="1000" Name="slider" Value="10"></Slider>
    <TextBox Height="30" Width="150"  Name="tex"  Validation.ErrorTemplate="{StaticResource ErrorTemplate}">
        <!--Validation.Error="tbx1_Error"-->
        <TextBox.Text>
            <Binding ElementName="slider" Path="Value" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
                <Binding.ValidationRules>
                    <local:CustomValidationRule ValidatesOnTargetUpdated="True"/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>

    </TextBox>
    <TextBox Height="30" Width="150" Margin="0,100,0,0">
        <i:Interaction.Behaviors>
            <local:TextBoxWatermarkBehavior Watermark="11111"/>
        </i:Interaction.Behaviors>
    </TextBox>
</Grid>

样式如下

  <ControlTemplate x:Key="ErrorTemplate">
      <DockPanel>
          <TextBlock DockPanel.Dock="Bottom"
                 Foreground="Red"
                 FontSize="10"
                 Text="{Binding ElementName=adornedElementName, 
                                  Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" 
                     Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"/>
          <Border BorderBrush="Red" BorderThickness="0.5">
              <AdornedElementPlaceholder Name="adornedElementName"/>
          </Border>
          <!--<Border BorderBrush="Red" BorderThickness="1">
              <AdornedElementPlaceholder Name="adornedElementName">
                  
              </AdornedElementPlaceholder>
          </Border>-->
      </DockPanel>
  </ControlTemplate>

C#代码

 public class ValidateModelBase:NotifyBase, IDataErrorInfo
 {

     public ValidateModelBase()
     {

     }

     #region 属性 
     /// <summary>
     /// 表当验证错误集合
     /// </summary>
     public Dictionary<string, string> dataErrors = new Dictionary<string, string>();

     /// <summary>
     /// 是否验证通过
     /// </summary>
     public bool IsValidated
     {
         get
         {
             if (dataErrors != null && dataErrors.Count > 0)
             {
                 return false;
             }
             return true;
         }
     }
     #endregion

     public string this[string columnName]
     {
         get
         {
             ValidationContext vc = new ValidationContext(this, null, null);
             vc.MemberName = columnName;
             var res = new List<System.ComponentModel.DataAnnotations.ValidationResult>();
             var result = Validator.TryValidateProperty(this.GetType().GetProperty(columnName).GetValue(this, null), 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 null;
         }
     }

     public string Error
     {
         get
         {
             return null;
         }
     }


     #region 附属方法
     /// <summary>
     /// 移除字典
     /// </summary>
     /// <param name="dics"></param>
     /// <param name="dicKey"></param>
     private void RemoveDic(Dictionary<string, string> dics, string dicKey)
     {
         dics.Remove(dicKey);
     }

     /// <summary>
     /// 添加字典
     /// </summary>
     /// <param name="dics"></param>
     /// <param name="dicKey"></param>
     private void AddDic(Dictionary<string, string> dics, string dicKey, string dicValue)
     {
         if (!dics.ContainsKey(dicKey)) dics.Add(dicKey, dicValue);
     }
     #endregion

 }

NotifyBase如下实现INotifyPropertyChanged接口

    public class NotifyBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

          public event EventHandler CanExecuteChanged
        {
            add
            {
                CommandManager.RequerySuggested += value;
            }


            remove
            {
                CommandManager.RequerySuggested -= value;
            }
        }

        public void SetProperty<T>(ref T feild, T value, [CallerMemberName] string propName = "")
        {
            feild = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        }
    }

  UserModel实体类如下

public class UserModel : ValidateModelBase
{
    private string userName;
    [Required(ErrorMessage = "用户名不可为空")]
    public string UserName
    {
        get { return userName; }
        set { userName = value; SetProperty(ref userName,value); }
    }

    private string userAge;
    [Required(ErrorMessage = "年龄不可为空")]
    [Range(0, 100, ErrorMessage = "年龄范围为0~100")]
    public string UserAge
    {
        get { return userAge; }
        set { userAge = value; SetProperty(ref userAge, value); }
    }

    private bool isFormValid;

    public bool IsFormValid
    {
        get { return isFormValid; }
        set { isFormValid = value; SetProperty(ref isFormValid, value); }
    }
}

  

标签:return,string,验证,get,value,表单,WPF,null,public
From: https://www.cnblogs.com/lisghxfdfgh/p/18597574

相关文章

  • php password_hash password_verify 加密验证不需要salt
    无意间发现php现在有这样的函数,它是php5.5以后引入的。用法如下<?php$passwordHash=password_hash('mypassword',PASSWORD_DEFAULT);var_dump($passwordHash);var_dump(password_verify('mypassword',$passwordHash));var_dump(password_verify('otherpass......
  • PHP版谷歌验证 (Google Authenticator)
    地址https://github.com/PHPGangsta/GoogleAuthenticator示例index.php<?phprequire_once'PHPGangsta/GoogleAuthenticator.php';$ga=newPHPGangsta_GoogleAuthenticator();//创建一个新的"安全密匙SecretKey"//把本次的"安全密匙SecretKey"入库,和账户关......
  • 某滑块验证码识别思路(附完整代码)
    思路验证码类型如下:大概搜索了下,有两种主流思路:yolo目标检测算法和opencv模版匹配。很明显第二种成本远小于第一种,也不需要训练。而且这种验证码有干扰(两个目标点),yolo一次还不能直接到位,还得进一步处理。我在搜索的时候还有用轮廓匹配做识别的,但是实测下来准确率很低,这里就......
  • 一个使用 WPF 开发的管理系统
    前言最近发现有不少小伙伴在学习WPF,今天大姚给大家分享一个使用WPF开发的管理系统,该项目包含了用户登录、人员管理、角色授权、插件管理、职位管理、主页功能(邮件、皮肤、设置)等功能,对于一个WPF初学者而言是一个值得参考和学习的项目。WPF介绍WPF是一个强大的桌面应用......
  • leetcode 面试经典 150 题:验证回文串
    链接验证回文串题序号125类型字符串解题方法双指针法难度简单题目如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串。字母和数字都属于字母数字字符。给你一个字符串s,如果它是回文串......
  • PbootCMS如何取消留言、自定义表单的验证码?
    在PbootCMS中,验证码可以增加系统的安全性,但在某些情况下,你可能希望取消留言表单和自定义表单中的验证码,以简化用户操作。以下是如何在PbootCMS中取消这些验证码的详细步骤和注意事项。登录PbootCMS后台:打开浏览器,访问你的PbootCMS后台登录页面(通常是 你的域名/admin)。输入......
  • Burp(8)-验证码爆破插件
    声明:学习视频来自b站up主泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec团队的教学视频地址:burp(6)暴力破解与验证码识别绕过_哔哩哔哩_bilibili本文详细介绍验证码爆破插件captcha-killer-modified的使用。一、环境配置安装ddddocr和aiohttp模块安装命令:pipinstall......
  • 城域网与数据中心互联 保姆级讲解(BGP综合选路)的配置过程及验证 HCIP大型网络设计必备
    本实验模拟某市ISP骨干网与两个数据中心互联的网络一、   实验拓扑二、   基础构思规划1.预配置包括:1.1所有设备互联IP已配置,且所有设备都有Loopback0地址。1.2SW1与SW2已创建vlan、划分vlan、并创建vlanif。1.3PC已配置IP和网关。2.在所有设备的系统......
  • 《Detecting probe resistant proxy》论文阅读、验证与obfs4proxy分析
    1引言当时看到这篇对代理检测的论文,对它的中文讨论较少,整理了自己阅读和实验后的笔记(关注于tor的obfs4),方便有需要的同学一起学习讨论。(现在obfs4都要过时啦,出了新的WebTunnels,但是嘛,升级迭代也要相当一段时间了)2论文阅读2.1探针选择我们的攻击集中在这样一个观察上,......
  • 基于验证链(Chain of Verification)的大语言模型幻觉问题解决方案
    LLM(SEALONG:LLM(LargeLanguageModel)在长上下文推理任务中的自我改进)在生成内容时往往会遭遇一个棘手的问题——幻觉(Hallucination)。模型自信地输出虚假或误导性信息,对依赖其准确输出的开发者、工程师及用户构成了实质性的挑战。为解决这一问题,研究者提出了ChainofVerificat......