2013-10-04 4 views
1

Я реализую IDataErrorInfo в моей ViewModel.Почему IDataErrorInfo показывает ошибки при запуске приложения

У меня есть 'Нома' два свойства & 'Prénom', который я хочу сделать обязательным

#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 моего TextBox вроде этого:

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

Моя проблема:: текстовые поля отображают ошибку (при запуске приложения) перед потерей фокуса.

Я делаю это (в случае щелчка), поэтому он должен показать ошибку после щелчка, а не раньше:

if (!IsValid) 
    return; 
+2

Это не нормальное поведение, потому что пустые поля не проходят проверку? Возможно, вам придется использовать 'UpdateSourceTrigger = Explicit', чтобы сделать эту работу так, как вы этого хотите. – Sheridan

+0

Я изменил его на Явный, но результат всегда тот же –

+0

@Sheridan Что заставляет меня сходить с ума, так это то, что я не делаю тест IsValid при запуске приложения :( –

ответ

2

Разве это не нормальное поведение, потому что пустые поля неудачу проверки? Возможно, вам понадобится использовать UpdateSourceTrigger=Explicit, чтобы сделать эту работу так, как вы этого хотите.

Я должен был использовать ответ, как я выбежал из пространства в комментариях

Вот вещь ... если поставить точку останова в методе IDataErrorInfo индексатор (это то же самое с CanExecute обработчик ICommand), а затем попытайтесь вернуться к приложению, точка останова немедленно попадет ... и это произойдет каждые время, когда вы пытаетесь вернуться в приложение.

Framework не всегда знает, когда следует проверять эти вещи, но они всегда будут проверяться при запуске ... подумайте об этом - для большинства ситуаций это именно то, что мы хотим. Просто прискорбно, что на этот раз ты не хочешь этого.

Лично я предпочитаю это в любом случае ... это называется прогностической валидацией или что-то в этом роде, и это позволяет пользователям узнать, что они должны заполнить до, они пытаются ввести данные. Конечно, это намного лучше, чем старая система ввода значений в полях, нажав кнопку «Сохранить», только чтобы сообщить, что у вас есть ошибка где-то. Таким образом, вы исправляете эту ошибку и пытаетесь сохранить ее снова, а затем узнаете о другой ошибке и т. Д.