为什么 IDataErrorInfo 在应用启动时显示错误
本文关键字:显示 错误 启动 应用 IDataErrorInfo 为什么 | 更新日期: 2023-09-27 18:34:05
我正在我的ViewModel中实现IDataErrorInfo。
我有两个属性"Nom"和"Prenom",我想将其设为强制性
#region IDataErrorInfo
string IDataErrorInfo.Error
{
get { return null; }
}
string IDataErrorInfo.this[string propertyName]
{
get { return GetValidationError(propertyName); }
}
#endregion IDataErrorInfo
#region Validation
private static readonly string[] ValidatedProperties = { "Nom", "Prenom" };
public bool IsValid
{
get
{
foreach (string property in ValidatedProperties)
if (GetValidationError(property) != null)
return false;
return true;
}
}
private string GetValidationError(string propertyName)
{
string error = null;
switch (propertyName)
{
case "Nom":
error = ValidateNom();
break;
case "Prenom":
error = ValidatePrenom();
break;
}
return error;
}
private string ValidateNom()
{
if (string.IsNullOrWhiteSpace(Nom))
{
return "Last name is mandatory";
}
return null;
}
private string ValidatePrenom()
{
if (string.IsNullOrWhiteSpace(Prenom))
{
return "First name is mandatory";
}
return null;
}
我像这样绑定文本框的文本属性:
<TextBox Text="{Binding Nom,
ValidatesOnDataErrors=True,
UpdateSourceTrigger=LostFocus,
NotifyOnValidationError=True}" />
我的问题是:文本框在失去焦点之前显示错误(在应用程序启动中(。
我正在这样做(在单击事件中(,因此它应该在单击之后而不是之前显示错误:
if (!IsValid)
return;
这不是
正常行为,因为空字段验证失败吗?您可能需要使用 UpdateSourceTrigger=Explicit
来使此操作按您希望的方式工作。
我不得不使用答案,因为我在评论中的空间不足
事情是这样的...如果在 IDataErrorInfo
索引器方法中放置断点(与ICommand
的CanExecute
处理程序相同(,然后尝试返回到应用程序,断点将立即命中...每次您尝试返回应用程序时都会发生这种情况。
框架并不总是知道何时检查这些东西,但它们将始终在启动时检查......想想看 - 在大多数情况下,这正是我们想要的。只是很不幸,这次你不想这样。
就个人而言,无论如何我更喜欢这种方式...它被称为预测验证或类似的东西,它允许用户在尝试输入数据之前知道他们必须填写的内容。当然,这比在字段中输入值,单击保存按钮的旧系统要好得多,只是被告知您在某处有错误。因此,您修复该错误并尝试再次保存,然后被告知另一个错误等。