INotifyDataErrorInfo не вызывает ошибку изменено в коде позади - PullRequest
0 голосов
/ 12 марта 2012

Я испытываю выполненную проверку с использованием кода.Мои данные отображаются в сетке данных.Один из столбцов (тип) представляет собой раскрывающийся список, и при изменении раскрывающегося меню он вызывает событие DropDownClosed, которое обрабатывается в приведенном ниже коде.

То, что я пытаюсь достичь, - это проверить содержимоеследующий столбец, чтобы соответствовать вновь выбранному типу в раскрывающемся списке.Если он не совпадает, я хочу, чтобы ошибка проверки отображалась в сетке.Я реализовал свою проверку с использованием интерфейса INotifyDataErrorInfo, и он работает очень хорошо, за исключением случаев, когда я использую его в коде.Когда код позади вызывает проверку, ValidationSummary сетки данных никогда не обновляется.Что я тут не так делаю ???При использовании отладчика я ясно вижу ошибки, добавляемые в словарь ошибок интерфейса ...

Вот обработчик:

        private void TypeBoxChanged(object sender, EventArgs e)
        {
        ComboBox box = (sender as ComboBox);
        IncomingPolicy row = (IncomingPolicy)box.DataContext;

        string ruleTypeValue = TypeList.GetKeyForText(box.SelectedItem.ToString());
        //check if the type is the same
        if(row.TypeWrapper == ruleTypeValue)
            return;
        if (row.ValidateRule(ruleTypeValue))
        {
            //SAVE the record
        }
        else
        {
            row.RaiseErrorsChanged("RuleWrapper");
        }
    }

Метод правила проверки будет основан наruletypevalue вызов этого метода

        public bool ValidateRegularExpression(string property, string value, string expression, string errorMessage)
        {
        bool isValid = true;
        Regex regex = new Regex(expression);
        Match match = regex.Match(value);
        if (match.Success)
        {
            RemoveError(property, errorMessage);                
        }
        else
        {
            AddError(property, errorMessage, false);
            isValid = false;
        }

        return isValid;
    }

Я следовал примеру реализации на MSDN http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo%28VS.95%29.aspx

1 Ответ

3 голосов
/ 13 марта 2012

Некоторое время назад я реализовал помощники проверки и создал пример решения для обоих интерфейсов IDataErrorInfo и INotifyDataErrorInfo:

http://vortexwolf.wordpress.com/2011/10/01/wpf-validation-with-idataerrorinfo/

Исходный код

Основная реализация здесь:

this.PropertyChanged += (s, e) => 
{
    // if the changed property is one of the properties which require validation
    if (this._validator.PropertyNames.Contains(e.PropertyName))
    {
        this._validator.ValidateProperty(e.PropertyName);
        OnErrorsChanged(e.PropertyName);
    }
}

Вы должны всегда вызывать метод OnErrorsChanged (или RaiseErrorsChanged в вашем случае) независимо от успешности проверки: если свойство недопустимо - будет отображаться красная граница, если оно действительно - привязанный элемент управления вернулся в нормальное состояние.

...