Сильная валидация в WPF - PullRequest
1 голос
/ 04 сентября 2008

У меня в приложении есть привязанный к данным TextBox, например: (тип Height равен decimal?)

<TextBox Text="{Binding Height, UpdateSourceTrigger=PropertyChanged, 
                        ValidatesOnExceptions=True, 
                        Converter={StaticResource NullConverter}}" />

public class NullableConverter : IValueConverter {
    public object Convert(object o, Type type, object parameter, CultureInfo culture) {
        return o;
    }

    public object ConvertBack(object o, Type type, object parameter, CultureInfo culture) {
        if (o as string == null || (o as string).Trim() == string.Empty)
            return null;
        return o;
    }
}

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

  1. Не позволяет TextBox потерять фокус, пока он не будет содержать действительное значение.
  2. Возвращает значение в TextBox к последнему действительному значению.

Каков наилучший способ сделать это?

Обновление:

Я нашел способ сделать # 2. Я не люблю это, но это работает:

private void TextBox_LostKeyboardFocus(object sender, RoutedEventArgs e) {
    var box = sender as TextBox;
    var binding = box.GetBindingExpression(TextBox.TextProperty);
    if (binding.HasError)
        binding.UpdateTarget();
}

Кто-нибудь знает, как сделать это лучше? (Или сделай №1.)

Ответы [ 2 ]

2 голосов
/ 06 сентября 2008

Вы можете заставить фокус клавиатуры оставаться на TextBox, обрабатывая событие PreviewLostKeyBoardFocus следующим образом:

 <TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" /> 

 private void TextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
     e.Handled = true;
 }
0 голосов
/ 04 сентября 2008

Мне кажется, что вы захотите обработать два события:

GotFocus: сработает, когда текстовое поле получает фокус. Вы можете сохранить начальное значение коробки.

LostFocus: сработает, когда текстовое поле теряет фокус. На этом этапе вы можете выполнить проверку и решить, хотите ли вы откатиться или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...