質問

私のアプリケーションには次のようなデータバインドされた 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 を実行します。)

役に立ちましたか?

解決

キーボードのフォーカスを強制的に上に留まらせることができます。 TextBox を扱うことによって PreviewLostKeyBoardFocus このようなイベント:

 <TextBox PreviewLostKeyboardFocus="TextBox_PreviewLostKeyboardFocus" /> 

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

他のヒント

次の 2 つのイベントを処理したいと思われます。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top