1

次のように、アプリケーションにデータバインドされた TextBox があります: (のタイプ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;
        }
    }

このように構成すると、10 進数に変換できない空でない文字列は検証エラーになり、すぐにテキスト ボックスが強調表示されます。ただし、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

次の2つのイベントを処理する必要があるように思われます。

GotFocus:テキストボックスがフォーカスを取得したときにトリガーされます。ボックスの初期値を保存できます。

LostFocus:テキストボックスがフォーカスを失ったときにトリガーされます。この時点で、検証を実行して、ロールバックするかどうかを決定できます。

于 2008-09-04T18:09:40.050 に答える