C# 为什么IDataErrorInfo在应用程序启动时显示错误
我正在ViewModel中实现IDataErrorInfo 我有两个属性'Nom'和'Prenom',我想强制执行C# 为什么IDataErrorInfo在应用程序启动时显示错误,c#,wpf,mvvm,idataerrorinfo,C#,Wpf,Mvvm,Idataerrorinfo,我正在ViewModel中实现IDataErrorInfo 我有两个属性'Nom'和'Prenom',我想强制执行 #region IDataErrorInfo string IDataErrorInfo.Error { get { return null; } } string IDataErrorInfo.this[string propertyName] { get { return GetValidati
#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}" />
这不是正常的行为,因为空字段验证失败了吗?您可能需要使用
UpdateSourceTrigger=Explicit
使其按您希望的方式工作
我不得不使用一个答案,因为我在评论中没有空间了
事情是这样的。。。如果在IDataErrorInfo
索引器方法中放置断点(这与ICommand
的CanExecute
处理程序相同),然后尝试返回到应用程序,断点将立即被命中。。。每次尝试返回应用程序时都会发生这种情况
框架并不总是知道什么时候检查这些东西,但它们总是在启动时被检查。。。想想看——在大多数情况下,这正是我们想要的。不幸的是你这次不想这样
就我个人而言,我更喜欢这种方式。。。它被称为预测验证或类似的东西,它允许用户在输入数据之前知道他们必须填写什么。当然,这比在字段中输入值的旧系统要好得多,单击“保存”按钮,结果却被告知某个地方有错误。因此,您修复了该错误并再次尝试保存,然后被告知另一个错误,等等。这不是正常的行为,因为空字段验证失败了吗?您可能需要使用
UpdateSourceTrigger=Explicit
使其按您希望的方式工作。我将其更改为Explicit,但结果总是一样的same@Sheridan让我抓狂的是,我没有在应用程序启动时进行IsValid测试:(@Schneider:data binding engine第一次绑定属性时,会对属性进行验证。为什么不应该这样做?因为正如您在验证方法中定义的那样,null
无效,并且您已经设置了NotifyOnValidationError=True
,那么您期望得到什么呢?我总是在正确的ty(例如,ValidateNom
),但将在您的案例中的主验证中检查其是否为null或空是否有效
;
if (!IsValid)
return;