ich ein Databound TextBox in meiner Anwendung haben wie folgt: (Die Art der Height
ist decimal?
)Starke Validierung in 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;
}
}
auf diese Weise konfiguriert, werden alle nicht-leere Zeichenfolgen, die nicht auf Dezimalergebnis umgewandelt werden in ein Überprüfungsfehler, der sofort die Textbox hervorhebt. Die TextBox kann jedoch weiterhin den Fokus verlieren und in einem ungültigen Zustand verbleiben. Was ich möchte, ist entweder:
- Nicht zulassen, dass die TextBox den Fokus verliert, bis es einen gültigen Wert enthält.
- Setzen Sie den Wert in der TextBox auf den letzten gültigen Wert zurück.
Was ist der beste Weg, dies zu tun?
Update:
Ich habe einen Weg gefunden, # 2 zu tun. Ich mag es nicht, aber es funktioniert:
private void TextBox_LostKeyboardFocus(object sender, RoutedEventArgs e) {
var box = sender as TextBox;
var binding = box.GetBindingExpression(TextBox.TextProperty);
if (binding.HasError)
binding.UpdateTarget();
}
Weiß jemand, wie man das besser macht? (Oder # 1.)