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

Я реализую IDataErrorInfo в своей ViewModel.

У меня есть два свойства Nom и Prenom, которые я хочу сделать обязательными.

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

Я привязываю атрибут Text моего TextBox следующим образом:

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

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

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

if (!IsValid)
    return;

person Wassim AZIRAR    schedule 04.10.2013    source источник
comment
Разве это не нормальное поведение, потому что пустые поля не проходят проверку? Возможно, вам придется использовать UpdateSourceTrigger=Explicit, чтобы все работало так, как вы хотите.   -  person Sheridan    schedule 04.10.2013
comment
Я изменил его на Explicit, но результат всегда один и тот же   -  person Wassim AZIRAR    schedule 04.10.2013
comment
@Sheridan Что меня сводит с ума, так это то, что я не провожу тест IsValid при запуске приложения :(   -  person Wassim AZIRAR    schedule 04.10.2013
comment
@Schneider: когда механизм привязки данных впервые связывает свойства, он проверяет их. Почему не следует этого делать?   -  person Dennis    schedule 04.10.2013
comment
потому что, как вы определили в методе проверки, null недействителен, и вы установили NotifyOnValidationError=True, так что вы ожидаете? Я всегда игнорирую null в функции проверки свойства (например, ValidateNom), но проверю, является ли оно нулевым или пустым в основной проверке в вашем случае IsValid;   -  person Bolu    schedule 04.10.2013
comment
Спасибо @Christophe за то, что поделились своим кодом. Я получил ответ на свой вопрос после просмотра вашей реализации IDataErrorInfo и свойства IsValid......   -  person Vishal    schedule 04.04.2015


Ответы (1)


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

Мне пришлось использовать ответ, так как мне не хватило места в комментариях

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

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

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

person Sheridan    schedule 04.10.2013