Frage

Ich habe eine datengebundene TextBox in meiner Anwendung wie folgt:(Die Art von Height Ist 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;
    }
}

Bei dieser Konfiguration führen alle nicht leeren Zeichenfolgen, die nicht in eine Dezimalzahl umgewandelt werden können, zu einem Validierungsfehler, der das Textfeld sofort hervorhebt.Allerdings kann die TextBox immer noch den Fokus verlieren und in einem ungültigen Zustand bleiben.Was ich tun möchte, ist entweder:

  1. Lassen Sie nicht zu, dass die TextBox den Fokus verliert, bis sie einen gültigen Wert enthält.
  2. Setzen Sie den Wert in der TextBox auf den letzten gültigen Wert zurück.

Wie geht das am besten?

Aktualisieren:

Ich habe einen Weg gefunden, #2 zu machen.Ich liebe 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 tun Sie #1.)

War es hilfreich?

Lösung

Sie können den Tastaturfokus erzwingen, auf dem zu bleiben TextBox durch den Umgang mit PreviewLostKeyBoardFocus Veranstaltung wie diese:

 <TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" /> 

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

Andere Tipps

Für mich hört es sich so an, als ob Sie zwei Ereignisse abwickeln möchten:

GotFocus:Wird ausgelöst, wenn das Textfeld den Fokus erhält.Sie können den Anfangswert der Box speichern.

LostFocus:Wird ausgelöst, wenn das Textfeld den Fokus verliert.An diesem Punkt können Sie Ihre Validierung durchführen und entscheiden, ob Sie ein Rollback durchführen möchten oder nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top