2012-05-17 2 views
3

Validation.Error 이벤트의 발생 순서와 관련하여 이상한 동작이 발생합니다. 설명서 here에 따르면 데이터 바인딩 엔진은 바인딩 된 요소의 Validation.Errors 연결된 속성에 추가 된 ValidationError를 먼저 제거합니다. 따라서,을 제거 에 대한 ValidationErrorEvent은 추가 이전에 해고해야하지만, 이벤트를 제거하기 전에 이상하게 내 경우에 추가 이벤트가 트리거됩니다. 여기에 제가 사용하고있는 코드가 있습니다.이상한 순서의 Validation.Error 이벤트 - 제거되기 전에 발동되었습니다.

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

사람이이 문제를 건너 않았거나, 내 코드에 뭔가 문제가있다?

+0

방금 ​​같은 문제가 발생했습니다. –

답변

1

source code 보면 제거하기 전에 새 유효성 검사 오류를 추가하는 단계 낡은

조심스럽게 다른

하나의 오류를 교체하는 동안 "아니오 오류"상태를 겪고 방지하기 위해 정렬
+0

내 응용 프로그램이 같은 오류로 고통받는 것 같아요. 텍스트 상자에 유효하지 않은 값을 입력하면 이벤트가 올바르게 시작되고 다른 유효하지 않은 값을 입력하면 EventAction.added 이벤트가 먼저 발생하고 EventAction.removed가 발생하여 텍스트가 완전히 유효하게 처리됩니다. 이 문제를 어떻게 해결할 수 있습니까? – Lorgarn

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

합니다.

-1

이 이벤트를 사용하여 오류 상태의 변경 사항을 확인할 수 있지만 오류가 발생한 것처럼 보이기 때문에 (이유는 fractor의 대답 참조) 대신 Validation.HasErrors 속성을 읽어야합니다.

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

가 동일한 핸들러에서이 작업을 수행, 항상 올바른 것입니다.