3

就 Validation.Error 事件的触发顺序而言,我遇到了奇怪的行为。根据此处的文档,数据绑定引擎首先删除可能已添加到绑定元素的 Validation.Errors 附加属性的任何 ValidationError。因此,Removed的 ValidationErrorEvent应该在 added 之前触发但奇怪的是,在我的情况下,added事件会在Removed事件之前触发。这是我正在使用的代码。

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);
    }
}

有没有人遇到过这个问题,或者我的代码有问题?

4

4 回答 4

1

查看源代码,在删除旧验证错误之前添加新验证错误的步骤

被仔细安排以避免在用另一个错误替换一个错误时经历“无错误”状态

于 2015-09-04T06:27:59.587 回答
0

请记住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);
    }
}

我知道这是一个老问题,但我希望它会有所帮助。

于 2016-09-20T10:51:27.540 回答
0

我阅读了很多论坛,发现这是一个 MS 3.5 到 4.0 升级问题,没有直接的解决方案。https://social.msdn.microsoft.com/Forums/vstudio/en-US/590dc1d4-045e-4bdf-a84b-d759a5903633/validationerror-giving-strange-behavior

但是,您可以使用以下代码做出决定

((BindingExpressionBase)e.Error?.BindingInError).HasValidationError

true = 如果有验证错误,否则为 false。它对我有用。

于 2020-02-27T15:16:20.917 回答
-1

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

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

在同一个处理程序中执行此操作,它将始终是正确的。

于 2016-09-27T13:36:02.217 回答