WPF ValidationRule和Validation.Error不会引发事件

WPF ValidationRule和Validation.Error不会引发事件,wpf,Wpf,这些代码有什么问题,Validation.Error从未被激发,而我将和NotifyOnValidationError属性设置为True。因此,“Grid_Error(objectsender,validationErrorReventArgs e)”方法从未执行过,但我不知道为什么:( 谢谢你的帮助 编辑: 下面是我的名字: class Names : ObservableCollection<Name> { public Names () { Na

这些代码有什么问题,Validation.Error从未被激发,而我将和NotifyOnValidationError属性设置为True。因此,“Grid_Error(objectsender,validationErrorReventArgs e)”方法从未执行过,但我不知道为什么:(

谢谢你的帮助

编辑:

下面是我的名字:

class Names : ObservableCollection<Name>
{
    public Names ()
    {
        Name aName = new Name("FirstName " + (this.Count +1).ToString(),
            "LastName " + (this.Count + 1).ToString());

        this.Add(aName);
    }
}

根据您的评论,我认为ValidationRule不会返回错误,因此不会触发错误事件。请尝试使用调试器单步执行验证方法

此外,验证仅在源代码更新时执行,通常在
LostFocus
上的文本框中执行

编辑:
MyNames
是一个集合,它没有您尝试绑定到的属性,输出窗口中应该有绑定错误


如果要绑定到第一个元素,则需要将路径更改为类似于
[0].LastName
的路径以进行姓氏绑定。

根据您的评论,我认为ValidationRule不会返回错误,因此不会触发错误事件。请尝试使用调试器单步执行验证方法

此外,验证仅在源代码更新时执行,通常在
LostFocus
上的文本框中执行

编辑:
MyNames
是一个集合,它没有您尝试绑定到的属性,输出窗口中应该有绑定错误


如果要绑定到第一个元素,需要将路径更改为类似于姓氏绑定的
[0].LastName

Names类是否实现了INotifyPropertyChanged


在文件的代码隐藏文件中,将datacontext设置为this。将
名称
对象作为属性公开,然后查看是否有效。我不习惯绑定到窗口中的静态资源。

名称类是否实现INotifyPropertyChanged


在文件的代码隐藏文件中,将datacontext设置为
this
。将
名称
对象作为属性公开,然后查看是否有效。我不习惯绑定到窗口中的静态资源。

应用程序无法修改此集合的内容。有关如何修改的示例,请参阅示例部分使用此附加属性

WPF数据绑定模型使您能够将ValidationRules与绑定对象相关联。在调用转换器之前,将目标值绑定到绑定源值传输期间会进行验证。以下描述了验证过程:

1.当值从目标属性传输到源属性时,数据绑定引擎首先删除可能已添加到绑定元素的Validation.Errors attached属性中的任何ValidationError。然后检查是否为该绑定定义了任何自定义ValidationRules,在这种情况下,它将调用Validate在每个ValidationRules上使用ate方法,直到其中一个发生错误或全部通过

2.一旦存在未通过的自定义规则,绑定引擎将创建ValidationError对象并将其添加到绑定元素的Validation.Errors集合中。当Validation.Errors不为空时,元素的Validation.HasError attached属性将设置为true。此外,如果绑定的NotifyOnValidationError属性为设置为true,则绑定引擎将引发元素上的Validation.Error attached事件

3.如果所有规则都通过,那么绑定引擎将调用转换器(如果存在)

4.如果转换器通过,绑定引擎将调用源属性的setter

5.如果绑定具有与其关联的ExceptionValidationRule,并且在步骤中引发异常 4,绑定引擎检查是否存在UpdateSourceExceptionFilter。您可以选择使用UpdateSourceExceptionFilter回调来提供用于处理异常的自定义处理程序。如果未在绑定上指定UpdateSourceExceptionFilter,则绑定引擎将创建带有异常的ValidationError并将其添加到验证。绑定元素的错误集合

还请注意,在任一方向(目标到源或源到目标)进行的有效值传输将清除Validation.Errors attached属性


有关此属性在多绑定方案中的行为的信息,请参阅ValidationError。

应用程序无法修改此集合的内容。有关如何使用此附加属性的示例,请参阅示例部分

WPF数据绑定模型使您能够将ValidationRules与绑定对象相关联。在调用转换器之前,将目标值绑定到绑定源值传输期间会进行验证。以下描述了验证过程:

1.当值从目标属性传输到源属性时,数据绑定引擎首先删除可能已添加到绑定元素的Validation.Errors attached属性中的任何ValidationError。然后检查是否为该绑定定义了任何自定义ValidationRules,在这种情况下,它将调用Validate在每个ValidationRules上使用ate方法,直到其中一个发生错误或全部通过

2.一旦存在未通过的自定义规则,绑定引擎将创建ValidationError对象并将其添加到绑定元素的Validation.Errors集合中。当Validation.Errors不为空时,元素的Validation.HasError attached属性将设置为true。此外,如果绑定的NotifyOnValidationError属性为设置为true,则绑定引擎将引发元素上的Validation.Error attached事件

3.如果所有规则都通过,那么绑定引擎将调用转换器(如果存在)

4.如果转换器
public class StringValidator : ValidationRule
{
    public override ValidationResult Validate(object value,
       System.Globalization.CultureInfo cultureinfo)
    {
        string aString = value.ToString();
        if (aString == "")
            return new ValidationResult(false, "String cannot be null");
        return new ValidationResult(true, null);
    }
}

private void Grid_Error(object sender, ValidationErrorEventArgs e)
{
    if(e.Action == ValidationErrorEventAction.Added) 
        MessageBox.Show(e.Error.ErrorContent.ToString());
}
class Names : ObservableCollection<Name>
{
    public Names ()
    {
        Name aName = new Name("FirstName " + (this.Count +1).ToString(),
            "LastName " + (this.Count + 1).ToString());

        this.Add(aName);
    }
}
class Name : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private string _firstName;
    private string _lastName;


    public Name(string fName,  string lName)
    {
        _firstName = fName;
        _lastName = lName;
    }

    public string FirstName 
    { 
        get
        {
            return _firstName;
        }
        set
        {
            _firstName = value; 
            PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
        }
    }
    public string LastName 
    {
        get
        {
            return _lastName;
        }
        set
        {
            _lastName = value; 
            PropertyChanged(this, new PropertyChangedEventArgs("LastName"));
        }
    }
}