none
C# WPF и валидация данных RRS feed

  • Вопрос

  • Доброго времени суток! 
    Есть приложение написанное на WPF (MVVM). На форме стоит стандартная валидация с использование IDataErrorInfo. В коде указано так:

    <TextBox Name="Amount" Text="{Binding AmountString, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}">
    <TextBox.InputBindings>
    <KeyBinding Key="Return" Command="{Binding ACommand}" CommandParameter="{Binding ElementName=Amount, Path=(Validation.HasError)}"/>
    </TextBox.InputBindings>
    </TextBox>

    Все работало как надо, но стало напрягать что сей механизм работает после введения каждого символа в поле. Т.е. например минимальна сумма должна быть 20, вбиваешь 2 и сразу естественно ошибка, как как стоит PropertyChanged.  Хотелось отделаться малой кровью при переделке и сделал так чтобы валидация работала по Enter'ру:

    <TextBox Name="Amount" Text="{Binding AmountString, Mode=TwoWay, UpdateSourceTrigger=Explicit, ValidatesOnDataErrors=True}" behaviors:TextBoxBehavior.EnterValue="True">
    <TextBox.InputBindings>
    <KeyBinding Key="Return" Command="{Binding ACommand}" CommandParameter="{Binding ElementName=Amount, Path=(Validation.HasError)}"/>
    </TextBox.InputBindings>
    </TextBox>

    Сам behavior:

    private static void EnterValuePreviewKeyDown(object sender, KeyEventArgs e)
            {
                TextBox tb = (TextBox)sender;
                switch (e.Key)
                {
                    case Key.Return:
                          BindingExpression exp = tb.GetBindingExpression(TextBox.TextProperty);
                         exp.UpdateSource();
                    break;
                    
                }
            }

    Работает в общем как надо, но почему-то после Enter сообщение с ошибкой (Messagebox) выскакивает по два раза. Ставил проверки, behavior срабатывает один раз а IDataErrorInfo два. Подскажите пожалуйста в чем может быть дело?
    Спасибо!

    2 октября 2015 г. 14:54

Ответы

  • Ну так запустите под отладкой и посмотрите почему это мессадж бокс два раза выстакивает. Может быть потому что когда бокс выскакивает то контрол теряет фокус и валидация вызывается еще раз например.

    Апдейт по LostFocus кстати обычно и является основанием для валидации.

    А вообще сейчас не 1980, какие еще мессадж боксы? Показывайте ошибку и рекомендацию как ее устаринит рядом с полем ввода без прерывания действий пользователя. Вот вам простейший пример:

    http://www.codeproject.com/Tips/690130/Simple-Validation-in-WPF


    This posting is provided "AS IS" with no warranties, and confers no rights.

    2 октября 2015 г. 16:37
    Модератор

Все ответы

  • Ну так запустите под отладкой и посмотрите почему это мессадж бокс два раза выстакивает. Может быть потому что когда бокс выскакивает то контрол теряет фокус и валидация вызывается еще раз например.

    Апдейт по LostFocus кстати обычно и является основанием для валидации.

    А вообще сейчас не 1980, какие еще мессадж боксы? Показывайте ошибку и рекомендацию как ее устаринит рядом с полем ввода без прерывания действий пользователя. Вот вам простейший пример:

    http://www.codeproject.com/Tips/690130/Simple-Validation-in-WPF


    This posting is provided "AS IS" with no warranties, and confers no rights.

    2 октября 2015 г. 16:37
    Модератор
  • http://www.codeproject.com/Tips/690130/Simple-Validation-in-WPF


    This posting is provided "AS IS" with no warranties, and confers no rights.

    Посмотрел - реальная тема :) Спасибо
    2 октября 2015 г. 17:47
  • Спасибо за ответ! По поводу 1980 года, так это требование заказчика. По поводу самой проблемы тут уже подсказали в английской ветке что это из-за совместного BindingExpression.UpdateSource() и Command(через KeyBinding). Думал что получится малой кровью обойтись, но увы придется переделать...
    5 октября 2015 г. 9:35