首页 > 解决方案 > WPF 字段验证

问题描述

嗨,我是 C# 的新手,我创建了一个 WPF 表单,它接收 csv 并将其保存在数据库中。现在我想知道是否有一个Validation Library我可以用来使这些字段检查更容易?就像我想实现一个必需的字段或其他东西,如果不需要该字段,它将引发错误。我怎样才能做到这一点?我已经阅读了一些类似这样的代码

[Required] // Not sure if this is the correct format
public string Name()
{
  get;set;
}

所以基本上我在考虑一种中间件类型的验证,我只需将[Required]属性放在模型类中,它就会为我进行验证。有这样的事吗?

更新:我通过验证的意思是,当我选择一个 csv 文件后,它将读取每行/列,现在每一列都将像 ex 一样进行验证。对于column[0](假设这是名称字段),那么当读取此字段并将其分配给变量时,应在继续分配给变量之前对其进行验证。不确定这是否可能更多它是这样的

string[] content = row.Split('|');
Customer customer = new Customer(content);
Lis<KeyValuePair<string, string>> rowList = Converter.ToKeyValuePair(customer);

这是该Customer课程的代码

class Converter
{
    public static List<KeyValuePair<string,string>> ToKeyValuePair(Customer customer)
    {
         List<KeyValuePair<string, string>> rowList = new List<keyValuePari<string, string>>();
         rowList.Add(new KeyValuePair<string, string>('name', customer.Name));
    }

    return rowList;
}

// 类客户

class Customer
{
    private string _name;

    public Customer(string[] content)
    {
        this.Name = content[0];
    }

    [Required] // Maybe some auto validation here where when the property is accessed it should be validated immediately
    public string Name
    {
         get { return _name; }
         set {
             // I'm thinking of some validation here?
              _name = value;
         }
    }
}

正如您在我的示例中看到的那样,我希望每当this.Name = content[0]访问属性 like 时,它​​都会自动验证内容是否具有价值

标签: c#.netwpf

解决方案


没有内置的“验证库”。你应该INotifyDataErrorInfo在你的类中实现接口:

public class Model
{
    [Required(ErrorMessage = "You must enter a username.")]
    [StringLength(10, MinimumLength = 4,
        ErrorMessage = "The username must be between 4 and 10 characters long")]
    [RegularExpression(@"^[a-zA-Z]+$", ErrorMessage = "The username must only contain letters (a-z, A-Z).")]
    public string Username { get; set; }

    [Required(ErrorMessage = "You must enter a name.")]
    public string Name { get; set; }
}

public class ViewModel : INotifyDataErrorInfo
{
    private readonly Dictionary<string, ICollection<string>>
       _validationErrors = new Dictionary<string, ICollection<string>>();
    private readonly Model _user = new Model();

    public string Username
    {
        get { return _user.Username; }
        set
        {
            _user.Username = value;
            ValidateModelProperty(value, "Username");
        }
    }

    public string Name
    {
        get { return _user.Name; }
        set
        {
            _user.Name = value;
            ValidateModelProperty(value, "Name");
        }
    }

    protected void ValidateModelProperty(object value, string propertyName)
    {
        if (_validationErrors.ContainsKey(propertyName))
            _validationErrors.Remove(propertyName);

        ICollection<ValidationResult> validationResults = new List<ValidationResult>();
        ValidationContext validationContext =
            new ValidationContext(_user, null, null) { MemberName = propertyName };
        if (!Validator.TryValidateProperty(value, validationContext, validationResults))
        {
            _validationErrors.Add(propertyName, new List<string>());
            foreach (ValidationResult validationResult in validationResults)
            {
                _validationErrors[propertyName].Add(validationResult.ErrorMessage);
            }
        }
        RaiseErrorsChanged(propertyName);
    }
    ...
}

此博客文章中描述了 WPF 中的完整数据验证过程,包括如何实现此接口和使用数据注释验证数据的示例。请通读一遍,如果遇到更具体的问题,请随时提出另一个问题。


推荐阅读