2008-09-04 9 views
1

J'ai un TextBox databound dans ma demande comme ceci: (Le type de Height est decimal?)Validation forte dans 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; 
    } 
} 

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

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

Quelle est la meilleure façon de faire cela?

Mise à jour:

J'ai trouvé un moyen de faire # 2. Je ne l'aime pas, mais il fonctionne:

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 # 1.)

Répondre

2

Vous pouvez forcer la mise au point du clavier pour rester sur le TextBox en traitant l'événement PreviewLostKeyBoardFocus comme ceci:

<TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" /> 

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

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

GotFocus: déclencheront quand concentrer les gains de zone de texte. Vous pouvez stocker la valeur initiale de la boîte. LostFocus: Se déclenchera lorsque la zone de texte perdra le focus. À ce stade, vous pouvez effectuer votre validation et décider si vous souhaitez revenir en arrière ou non.

Questions connexes