如何获取 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 实现的误解
在这条路上
- 您只能验证一个 属性。如果两个 属性 有错误,则无法找到每个 属性
的错误
- 您无法确定模型是否有效,直到调用 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。
我有一个 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 实现的误解 在这条路上
- 您只能验证一个 属性。如果两个 属性 有错误,则无法找到每个 属性 的错误
- 您无法确定模型是否有效,直到调用 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。