我正在我的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 attribut,如下所示:
<TextBox Text="{Binding Nom,
ValidatesOnDataErrors=True,
UpdateSourceTrigger=LostFocus,
NotifyOnValidationError=True}" />
我的问题是:文本框在失去焦点之前显示错误(在应用启动时)。
我正在这样做(在点击事件中)所以它应该在点击后显示错误,而不是之前:
if (!IsValid)
return;
答案 0 :(得分:2)
这是不正常的行为,因为空字段验证失败?您可能需要使用UpdateSourceTrigger=Explicit
以您希望的方式完成此工作。
我必须使用答案,因为我在评论中用完了空间
这就是......如果你在IDataErrorInfo
索引器方法中设置一个断点(它与CanExecute
的{{1}}处理程序相同)然后尝试返回应用程序,断点将立即被击中......这将发生每次时间您尝试返回应用程序。
框架并不总是知道何时检查这些东西,但是它们将始终在启动时进行检查...想一想 - 对于大多数情况来说,这正是我们想要的。很遗憾你这次不想要这个。
就个人而言,无论如何我更喜欢这种方式......它被称为预测性验证或类似的东西,它允许用户在尝试输入数据之前知道他们必须填写。当然,这比在字段中输入值的旧系统要好得多,单击保存按钮,只是被告知您在某处有错误。所以你修复了那个错误并尝试再次保存,然后告诉另一个错误,等等。