Domanda

Ho una casella di testo con associazione dati nella mia applicazione in questo modo:(Il tipo di 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;
    }
}

Configurata in questo modo, qualsiasi stringa non vuota che non può essere convertita in decimale genera un errore di convalida che evidenzierà immediatamente la casella di testo.Tuttavia, il TextBox può comunque perdere lo stato attivo e rimanere in uno stato non valido.Quello che vorrei fare è:

  1. Non consentire a TextBox di perdere lo stato attivo finché non contiene un valore valido.
  2. Ripristina il valore nella casella di testo sull'ultimo valore valido.

Qual è il modo migliore per farlo?

Aggiornamento:

Ho trovato un modo per fare il punto 2.Non mi piace, ma funziona:

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

Qualcuno sa come farlo meglio?(Oppure fai #1.)

È stato utile?

Soluzione

Puoi forzare il focus della tastiera a rimanere su TextBox gestendo il PreviewLostKeyBoardFocus evento come questo:

 <TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" /> 

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

Altri suggerimenti

Mi sembra che vorrai gestire due eventi:

Mi sono concentrato:Si attiverà quando la casella di testo viene messa a fuoco.È possibile memorizzare il valore iniziale della casella.

Messa a fuoco persa:Si attiverà quando la casella di testo perde il focus.A questo punto puoi fare la tua validazione e decidere se vuoi eseguire il rollback oppure no.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top