0

私の見解では、テキストボックスに入力された正しい値に基づいて実行できる(ボタンを有効または無効にする)ことができる、または実行できないに接続されているTextboxとそのButton 隣があります。Command

ユーザーが正しい値を入力してTabキーを押した後、ボタンが正しく有効になっても、フォーカスは指定されたボタンではなく、その後のコントロールに移動するという事実を除いて、すべてが正常に機能します。

つまり、TABを押してボタンを有効にし、フォーカスを取得した後、UIの速度が十分ではありません。代わりに、ボタンは有効になりますが、フォーカスがすでに他のコントロールに移動された後です。

バインディングのUpdateSourceTriggerは、ユーザーが入力するすべての文字に対して多くのことが起こるので、そのようにしたいと思います。TextBoxLostFocusPropertyChanged

助言がありますか?前もって感謝します。

4

2 に答える 2

0

私には、いくつかのオプションがあるようです。

  1. UpdateSourceTrigger=Explicit代わりに使用して、バインディングを更新し、必要に応じてボタンにフォーカスを設定するLostFocus独自のハンドラーをアタッチします。LostFocus
  2. LostFocusテキストが有効かどうかをチェックし、有効な場合はボタンにフォーカスを戻す独自のハンドラーをアタッチします。

どちらの場合も、別のディスパッチャメッセージで設定されたフォーカスを実行する必要がある場合があります。

private void OnLostFocus(...)
{
    if (textIsValid)
    {
        this.Dispatcher.BeginInvoke((Action)() => button.Focus());
    }
}
于 2012-05-24T07:55:31.320 に答える
0

最後に、使用しているMVVMパターン(特定の名前を持つ特定のコントロールを参照)をあまり破壊せずに解決策を見つけました。

私がしたことは、の代わりにに設定UpdateSourceTriggerすることです。問題は、私がもう走っていないことでした。そのため、ボタンが正しく有効または無効になり、フォーカスを受け取る準備が整うようになりましたが、テキストボックスに表示された値は正しくありませんでした。PropertyChangedLostFocusPropertyChangedValueConverter

LostFocusテキストボックスのイベントを聞いて、それを使用しBindingExpression.UpdateTarget()て、TextBox.Text正しく表示されるようになりました。

ここにあります:

<TextBox
    Text="{Binding Path=SpecialText, Converter={StaticResource myConverter}, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
    LostFocus="TextBox_LostFocus">
</TextBox>


private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
    (sender as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateTarget();
}
于 2012-05-24T09:44:21.120 に答える