WPF 输入框数据验证处理,错误提示,以及初始化未输入时不验证

model类

继承INotifyPropertyChanged,实现双向数据同步
继承IDataErrorInfo,实现错误输出

 internal class User:INotifyPropertyChanged,IDataErrorInfo
 {
  Dictionary<string, List<ValidationResult>> errorDic=new Dictionary<string, List<ValidationResult>>();
     public string _name;
     /// <summary>
     /// 是否可以验证
     /// </summary>
     bool isValidatorName=false;
     public string this[string columnName]
     {
         get
         {
          
             var vc = new ValidationContext(this, null, null);
             vc.MemberName = columnName;
             //错误缓存
             var res = new List<ValidationResult>();
             var result = Validator.TryValidateProperty(this.GetType().GetProperty(columnName).GetValue(this, null), vc, res);
             //把所有错误存入字典
              if(!errorDic.ContainsKey(columnName))
				 {
				     errorDic.Add(columnName, res);
				 }
				 else
				 {
				     errorDic[columnName] = res;
				 }
 			  if(columnName=="Name"&& !isValidatorName)
             {
                 return string .Empty;
             }           
			  if (res.Count > 0)
             {
                 return string.Join(Environment.NewLine, res.Select(r => r.ErrorMessage).ToArray());
             }
             return string.Empty;
         }
     }
     public string Error
     {
         get { return null; }
     }
     /// <summary>
     /// 要验证的字段
     /// </summary>
     [Required(ErrorMessage = "[登录名]内容不能为空!")]
     [StringLength(4, ErrorMessage = "[登录名]内容最大允许255个字符!")]
     [RegularExpression("^[A-Za-z0-9]+$", ErrorMessage = "[登录名]格式不正确!")]
     public string Name
     {
         get { return _name; }
         set { _name = value;
             OnPropertyChanged("Name");
             isValidatorName = true;
         }
     }

     /// <summary>
     /// 双向同步处理
     /// </summary>
     public event PropertyChangedEventHandler? PropertyChanged;
     void OnPropertyChanged( string propName)
     {
         PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propName));
     }
      /// <summary>
	 /// 验证所有字段是否合法
	 /// </summary>
	 /// <returns></returns>
	 public bool IsValidator()
	 {
	     return errorDic.Values.Sum(e=>e.Count)==0;
	 }
	  /// <summary>
	 /// 获取字段错误信息
	 /// </summary>
	 /// <param name="columnName"></param>
	 /// <returns></returns>
	 public List<ValidationResult> GetErrorList(string columnName)
	 {
	     if(errorDic.ContainsKey(columnName))
	     return errorDic[columnName];
	     return new List<ValidationResult>();
	 }
 }

在这里插入图片描述
自定义isValidatorName字段,初始化为false,此时不输出错误
在这里插入图片描述
Name字段被修改时说明用户在输入了,此时isValidatorName改为true,开始验证此字段.
这样可以防止初始化页面时显示判空的错误提示.

页面

  public partial class MainWindow : Window
  {

       User user { get; set; }
      public MainWindow()
      {
          InitializeComponent();
          user=new User();
          this.DataContext = user;
      }
}

页面进行数据绑定
初始化User类的实例并绑定到页面DataContext

输入框样式

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="BlueTextBox" TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="Validation.ErrorTemplate">
                    <Setter.Value>
                        <ControlTemplate>
                            <DockPanel LastChildFill="True">
                                <TextBlock DockPanel.Dock="Bottom" Background="Red" Foreground="White" FontSize="12" Height="14"
                                                       Width="Auto"
                                                       VerticalAlignment="Center" TextAlignment="Center" TextWrapping="Wrap" FontFamily="Arial" 
                                                 Text="{Binding ElementName=ErrorBox, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                                </TextBlock>
                                <AdornedElementPlaceholder Name="ErrorBox" />
                            </DockPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>

    </Style>
</ResourceDictionary>

如果有错误,显示出来
AdornedElementPlaceholder 提取了错误内容,样式中写一个TextBlock 输出错误
Text=“{Binding ElementName=ErrorBox, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}”

画页面

 <Window.Resources>
     <ResourceDictionary Source="TextBoxStyle.xaml"></ResourceDictionary>
 </Window.Resources>

页面引用资源样式文件

  <TextBox  x:Name="userName" Style="{StaticResource BlueTextBox}"    Width="200" Height="30">
      <TextBox.Text>
          <Binding Path="Name" UpdateSourceTrigger="PropertyChanged"  ValidatesOnDataErrors="true" >
            
          </Binding>
      </TextBox.Text>

  </TextBox>

输入框设置样式,并绑定了页面数据的Name属性同步数据, Path=“Name”.
绑定事件输入时更新数据,UpdateSourceTrigger=“PropertyChanged”,
设置有错误时输出显示出来ValidatesOnDataErrors=“true”,


  private void Button_Click(object sender, RoutedEventArgs e)
  {
  		//验证字段是否合法
      if (user.IsValidator())
      {

      }
    
  }

后台验证是否通过.

总结

整体思数是model类继承IDataErrorInfo接口,当有数据修改时启用验证,并把验证错误信息返回,页面输入框的模板通过AdornedElementPlaceholder输出错误信息.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF 中,数据验证是一个重要的主题。WPF 中的数据验证分为两种:验证数据模型和验证用户界面输入。前者通常是通过使用数据模型中的属性和方法来完成的,而后者通常是通过使用 WPF数据绑定功能来完成的。 在本文中,我们将重点讨论如何使用 WPF数据绑定功能来验证用户界面输入WPF 中的数据绑定提供了两种验证方式:基于属性的验证和基于规则的验证。基于属性的验证是针对单个属性进行的验证,而基于规则的验证则是针对整个对象进行的验证。 基于属性的验证可以通过设置属性的 Metadata 来实现。例如,可以使用 RequiredAttribute 来标记属性为必填项。当用户尝试提交表单并且填写必填项WPF 将会自动显示错误提示信息。 基于规则的验证可以通过实现 IDataErrorInfo 接口来实现。该接口包含两个属性:Error 和 Item。Error 属性用于返回整个对象的错误信息,而 Item 属性用于返回单个属性的错误信息。 下面是一个示例,演示如何使用 IDataErrorInfo 接口来实现基于规则的验证: ```csharp public class Person : IDataErrorInfo { public string Name { get; set; } public int Age { get; set; } public string this[string columnName] { get { string error = null; switch (columnName) { case "Name": if (string.IsNullOrEmpty(Name)) error = "Name is required."; break; case "Age": if (Age < 0 || Age > 120) error = "Age must be between 0 and 120."; break; } return error; } } public string Error { get { return null; } } } ``` 在上面的示例中,我们实现了 IDataErrorInfo 接口,并使用 switch 语句检查每个属性的值。如果属性的值不符合要求,我们就返回一个错误信息。在 XAML 中,可以使用 Binding.ValidationRules 属性来指定要使用的验证规则。 ```xaml <TextBox Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" /> <TextBox Text="{Binding Path=Age, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" /> ``` 在上面的示例中,我们将 ValidatesOnDataErrors 属性设置为 True,以启用基于规则的验证。当用户尝试提交表单WPF 将自动检查数据模型中的属性并显示错误提示信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值