如何获取 WPF DataGrid 控件列中所有错误的列表?

How to get a list of all errors in a column on a WPF DataGrid control?

我有一个 DataGrid 控件绑定到实现 INotifyDataErrorInfo 的模型类型的 ObservableCollection。 DataGrid 在 PhoneNumber 列的单元格上正确显示错误信息。但是,我想在用户将数据提交到数据库之前向用户显示有错误的 phone 数字的数量(例如,页面上某处带有工具提示的数字)。我已经在互联网上搜索了有关此的任何线索,但一无所获。这是模型的实现 class:

''' 
public class ContactModel : ObservableObject, INotifyDataErrorInfo
{
    private readonly List<string> _errors = new();

    private string _firstName = String.Empty;
    public string FirstName
    {
        get => _firstName;
        set
        {
            _firstName = value;
            OnPropertyChanged(nameof(FirstName));
        }
    }

    private string _lastName = String.Empty;
    public string LastName
    {
        get => _lastName;
        set
        {
            _lastName = value;
            OnPropertyChanged(nameof(LastName));
        }
    }

    private string _phoneNumber = string.Empty;
    public string PhoneNumber
    {
        get => _phoneNumber;
        set
        {
            _phoneNumber = value;
            OnPropertyChanged(nameof(PhoneNumber));
        }
    }

    public bool HasErrors
    {
        get
        {
            return _errors.Any();
        }
    }

    public IEnumerable GetErrors(string? propertyName)
    {
        switch (propertyName)
        {
            case nameof(PhoneNumber):
                if (string.IsNullOrEmpty(nameof(PhoneNumber))
                {
                    _errors.Add("Phone number is blank");
                }
                break;

            case nameof(FirstName):
                // do nothing
                break;

            case nameof(LastName):
                // do nothing
                break;

            default:
                break;
        }

        return _errors;
    }

    public event EventHandler<DataErrorsChangedEventArgs>? ErrorsChanged;
}

'''

这是对 INotifyDataErrorInfo 实现的误解 在这条路上

  1. 您只能验证一个 属性。如果两个 属性 有错误,则无法找到每个 属性
  2. 的错误
  3. 您无法确定模型是否有效,直到调用 GetError。

添加验证错误属性

将“_errors”属性设为public 属性设为ObservableCollection

private ObservableCollection<ValidationResult> _errors;
public ObservableCollection<ValidationResult> Errors
{
   get{return _errors;}
   set{_errors = value;
       OnPropertyChanged(nameof(Errors));
       }
}

然后在模型cunstructor中构造它。

然后在 属性 setter.

上调用验证程序
    private string _phoneNumber = string.Empty;
        public string PhoneNumber
        {
            get => _phoneNumber;
            set
            {
                 _errors.RemoveRange(_errors.Where(w=> w.Membernames.Containes(nameof(PhoneNumber))));
                _phoneNumber = value;
                if (string.IsNullOrEmpty(value)
                {
                    _errors.Add(new ValidationResult("Phone number is blank",new string[]{nameof(PhoneNumber)}));
ErrorsChanged?.invoke(this,new DataErrorsChangedEventArgs(nameof(PhoneNumber)));
                }
                OnPropertyChanged(nameof(PhoneNumber));
            }
        }

将 GetError 更改为

 public IEnumerable GetErrors(string? propertyName)
    {
         return _errors.Where(w=> w.Membernames.Containes(propertyName);
    }

因此您可以将列表框(或称为 ValidationSummary 的复杂控件)添加到表单并将其源绑定到模型的 ValidationErrors 属性。

InotifyPropertyInfo 的最佳实践实现是在基础模型(示例中的 ObservableObject)上实现它 class。