WPF中的强大验证

时间:2008-09-04 17:47:49

标签: wpf validation data-binding

我的应用程序中有一个数据绑定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;
    }
}

以这种方式配置,任何无法转换为十进制的非空字符串都会导致验证错误,该错误将立即突出显示文本框。但是,TextBox仍然可能失去焦点并保持无效状态。我想做的是:

  1. 在包含有效值之前,不允许TextBox失去焦点。
  2. 将TextBox中的值还原为最后一个有效值。
  3. 这样做的最佳方式是什么?

    更新

    我找到了办法#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。)

2 个答案:

答案 0 :(得分:2)

您可以通过像这样处理TextBox事件来强制键盘焦点保持在PreviewLostKeyBoardFocus上:

 <TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" /> 

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

答案 1 :(得分:0)

听起来你想要处理两件事:

GotFocus:当文本框获得焦点时会触发。您可以存储该框的初始值。

LostFocus:当文本框失去焦点时会触发。此时,您可以进行验证并决定是否要回滚。