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:
- Ne pas permettre à la TextBox de perdre le focus jusqu'à ce qu'il contienne une valeur valide.
- 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.)