2013-10-04 2 views
1

ViewModel에 IDataErrorInfo를 구현하고 있습니다.IDataErrorInfo가 앱 시작시 오류를 표시하는 이유

<TextBox Text="{Binding Nom, 
         ValidatesOnDataErrors=True, 
         UpdateSourceTrigger=LostFocus, 
         NotifyOnValidationError=True}" /> 

:

나는

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

나는 이런 내 텍스트 상자의 텍스트 attribut을 결합하고있어 의무적으로 만들고 싶어 두 가지 속성 '놈'& 'Prenom'을 가지고 내 문제는입니다 : 포커스를 잃기 전에 텍스트 상자에 오류 (응용 프로그램 시작)가 표시됩니다.

나는 (클릭 이벤트에서)이 일을 해요 그래서하지 전에 클릭 한 후 오류를 보여해야

if (!IsValid) 
    return; 
+2

빈 필드가 유효성 검사에 실패했기 때문에 정상적으로 작동하지 않습니까? 이 작업을 원하는대로하려면'UpdateSourceTrigger = Explicit'을 사용해야 할 수도 있습니다. – Sheridan

+0

명시 적으로 변경했지만 결과는 항상 동일합니다. –

+0

@Sheridan 무엇이 나를 미치게 만들지는 않습니다. 앱 시작시 IsValid 테스트를 수행하지 않습니다. ( –

답변

2

이 빈 필드 유효성 검사가 실패 때문 정상적인 동작이 아닌가? 원하는대로이 작업을 수행하려면 UpdateSourceTrigger=Explicit을 사용해야 할 수도 있습니다. 내가 코멘트 여기

공간의 부족으로

나는 대답을 사용했던 것입니다 ... 당신이 당신의 IDataErrorInfo 인덱서 방법에 브레이크 포인트를 넣어 경우 (가와 동일합니다 CanExecute 처리기가 ICommand 인 경우) 응용 프로그램으로 돌아 가려하면 중단 점에 즉시 도달합니다 ... 그러면 마다 번 응용 프로그램으로 돌아 가려고 시도합니다.

프레임 워크는 이러한 것들을 언제 체크해야 할지를 항상 알지는 못하지만, 시작시 항상 체크됩니다. 생각해보십시오. 대부분의 경우, 정확히 우리가 원하는 것입니다. 이 시간을 원하지 않는다는 것은 불행한 일입니다.

필자는 개인적으로 예측 형 검증이라고 부르며 사용자가 에 기입해야하는 내용을 알 수 있도록하기 전에 데이터를 입력하려고합니다. 분명히 이것은 저장 버튼을 클릭하여 필드에 값을 입력하는 기존의 시스템보다 훨씬 좋으며 어딘가에 오류가 있음을 알리는 것입니다. 그래서 그 오류를 수정하고 다시 저장하고 다른 오류 등을 들으십시오.

관련 문제