次のように、アプリケーションにデータバインドされた TextBox があります: (のタイプ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;
}
}
このように構成すると、10 進数に変換できない空でない文字列は検証エラーになり、すぐにテキスト ボックスが強調表示されます。ただし、TextBox は引き続きフォーカスを失い、無効な状態のままになる可能性があります。私がやりたいことは次のいずれかです:
- 有効な値が含まれるまで、TextBox がフォーカスを失うことを許可しません。
- TextBox の値を最後の有効な値に戻します。
これを行う最善の方法は何ですか?
アップデート:
#2を行う方法を見つけました。私はそれが好きではありませんが、うまくいきます:
private void TextBox_LostKeyboardFocus(object sender, RoutedEventArgs e) {
var box = sender as TextBox;
var binding = box.GetBindingExpression(TextBox.TextProperty);
if (binding.HasError)
binding.UpdateTarget();
}
これをより良く行う方法を知っている人はいますか?(または #1 を実行します。)