У меня есть 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 все еще может потерять фокус и оставаться в недопустимом состоянии. То, что я хотел бы сделать, это либо:
- Не допускайте, чтобы TextBox терял фокус, пока он не содержит допустимое значение.
- Восстановить значение в текстовом поле до последнего действительного значения.
Каков наилучший способ для этого?
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.)