2008-09-04 2 views
1

У меня есть DataBound TextBox в моем приложении, как так: (Тип Height является decimal?)Strong проверки в WPF

<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. Восстановить значение в текстовом поле до последнего действительного значения.

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

Update:

Я нашел способ сделать # 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

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

<TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" /> 

private void TextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) { 
    e.Handled = true; 
} 
0

Это звучит для меня, что вы хотите, чтобы обрабатывать два события:

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

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

Смежные вопросы