Validation.Error事件触发的奇怪顺序 - 删除之前加入解雇(Strange order

2019-09-17 06:48发布

至于Validation.Error事件的点火顺序是关心我得到奇怪的行为。 根据该文件在这里 , 数据绑定引擎首先去除可能已被添加到附接结合的元件的特性的任何Validation.Errors ValidationError。 因此, 删除了ValidationErrorEvent应添加之前被解雇,但奇怪的是在我的情况下添加的事件被被去除的事件之前触发。 下面是我使用的代码。

XAML

<TextBox Grid.Row="3" Grid.Column="1" Name="txtGroupsPerRow" >
    <TextBox.Text>
        <Binding Path="StandardRack.NoOfGroupsPerRow" ValidatesOnDataErrors="True" NotifyOnValidationError="True" 
                 UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <gs:NumericValidationRule PropertyName="No Of Groups Per Row"/>
            </Binding.ValidationRules>
        </Binding> 
    </TextBox.Text>
</TextBox>

代码隐藏

private RoutedEventHandler _errorEventRoutedEventHandler;
private void UserControl_Loaded(object sender, RoutedEventArgs e) {
    _errorEventRoutedEventHandler = new RoutedEventHandler(ExceptionValidationErrorHandler);
    this.AddHandler(System.Windows.Controls.Validation.ErrorEvent, _errorEventRoutedEventHandler, true); 
}

private void UserControl_Unloaded(object sender, RoutedEventArgs e) {
    this.RemoveHandler(System.Windows.Controls.Validation.ErrorEvent, _errorEventRoutedEventHandler);
    _errorEventRoutedEventHandler = null;
}

//Added fired before Removed
private void ExceptionValidationErrorHandler(object sender, RoutedEventArgs e) {
    if (validationErrorEvent.Action == ValidationErrorEventAction.Added) {
        viewModel.AddValidationError(propertyPath, validationErrorEvent.Error.ErrorContent.ToString());
    }
    else if (validationErrorEvent.Action == ValidationErrorEventAction.Removed) {
        viewModel.RemoveValidationError(propertyPath);
    }
}

有没有人碰到这个问题,或者是有什么错我的代码?

Answer 1:

纵观源代码 ,添加新的验证错误的步骤删除一个旧的前

仔细责令避免经历一个“没有错误”状态,而用另一个更换一个错误



Answer 2:

牢记fractor的答案,你可以尝试做一些变通。 创建一些反将代表验证控件的错误数:

int errorCounter = 0;
private void TextBox_Error(object sender, ValidationErrorEventArgs e)
{
    var tb = sender as TextBox;
    if (tb != null)
    {
        errorCounter += (e.Action == ValidationErrorEventAction.Added) ? 1 : -1;
        //here do whatever you want to with you stored information about error
        someControl.IsEnabled = !(errorCounter > 0);
    }
}

我知道这是有点老问题,但我希望这将有助于。



Answer 3:

您可以使用此事件,以确定错误状态的变化,但由于它们出现乱序(有很好的理由,见fractor的答案),你应该阅读Validation.HasErrors属性。

var hasErrors = (bool)GetValue(Validation.HasErrorProperty);

在相同的处理做到这一点,它永远是正确的。



文章来源: Strange order of firing of Validation.Error event - Added fired before Removed
标签: wpf wpf-4.0