我的应用程序中有一个数据绑定文本框,如下所示:(类型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;
}
}
以这种方式配置,任何无法转换为十进制的非空字符串都会导致验证错误,该错误将立即突出显示文本框。但是,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。)