1

我的应用程序中有一个数据绑定文本框,如下所示:(类型Heightdecimal?

    <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 中的值恢复为最后一个有效值。

做这个的最好方式是什么?

更新:

我找到了一种方法来做#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。)

4

2 回答 2

2

TextBox您可以通过如下处理PreviewLostKeyBoardFocus事件来强制键盘焦点停留在 上:

     <TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" /> 
     private void TextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) {
         e.Handled = true;
     }
于 2008-09-06T17:00:44.037 回答
0

在我看来,您需要处理两个事件:

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

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

于 2008-09-04T18:09:40.050 回答