Question

J'ai une TextBox liée aux données dans mon application comme ceci :(Le type de Height est 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;
    }
}

Configurée de cette façon, toutes les chaînes non vides qui ne peuvent pas être converties en décimal entraînent une erreur de validation qui mettra immédiatement en évidence la zone de texte.Cependant, la TextBox peut toujours perdre le focus et rester dans un état non valide.Ce que j'aimerais faire c'est soit :

  1. Ne laissez pas TextBox perdre le focus jusqu'à ce qu'il contienne une valeur valide.
  2. Rétablit la valeur dans TextBox à la dernière valeur valide.

Quelle est la meilleure façon de procéder?

Mise à jour:

J'ai trouvé un moyen de faire le n°2.Je n'aime pas ça, mais ça marche :

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

Est-ce que quelqu'un sait comment faire mieux ?(Ou faites le n°1.)

Était-ce utile?

La solution

Vous pouvez forcer le focus du clavier à rester sur le TextBox en manipulant le PreviewLostKeyBoardFocus événement comme celui-ci :

 <TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" /> 

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

Autres conseils

Il me semble que vous souhaiterez gérer deux événements :

Focalisé:Se déclenchera lorsque la zone de texte aura le focus.Vous pouvez stocker la valeur initiale de la boîte.

Focus perdu :Se déclenchera lorsque la zone de texte perd le focus.À ce stade, vous pouvez faire votre validation et décider si vous souhaitez revenir en arrière ou non.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top