3

私の見解では、TextBox と Button があり、TextBox の Text プロパティは ViewModel のパブリック プロパティにバインドされ、ユーザーがボタンをクリックすると、TextBox にテキストが取得されます。また、ボタンの IsDefault プロパティを true に設定して、Enter キーを押してクリック イベントを起動できるようにします。私のプロジェクトは MVVM を使用しているため、ボタンのコマンドも ViewModel に含まれています。さて、問題は、ボタンをクリックするとTextBoxにテキストを取得できますが、Enterボタンを押してもテキストを取得できず、常にnullになることです。ブレークポイントを設定して、テキストボックスにテキストを入力してボタンをクリックすると、RaisePropertyChanged イベントが発生しますが、ボタンを押しても発生しません。誰でも助けることができますか?

ありがとう!

4

3 に答える 3

5

デフォルトでは、フォーカスが失われたときにTextBoxバインドされたプロパティのみを更新します。Text2 つのオプションがあります。フォーカスの変更を誘導する (ユーザーにとっては煩わしい可能性があります) か、この動作を変更します。

動作を変更するにUpdateSourceTriggerは、TextBox バインディングのプロパティを次のように変更しPropertyChangedます。

<TextBox Text={Binding Path=MyTextProperty, UpdateSourceTrigger=PropertyChanged}/>

これは、各プロパティの変更でどれだけの作業を行っているかによって、うまくいく場合とうまくいかない場合があります。一部のシナリオでは、パフォーマンスが大幅に低下する可能性があります。その場合は、ビュー モデル コードを作り直して、プロパティが変更されたときの作業を減らすことをお勧めします。

于 2013-09-17T03:14:53.553 に答える
3

私はこのアプローチを使用してこの作業を行います。イベントハンドラを app.xaml.cs OnStartUp() に追加するだけです

    EventManager.RegisterClassHandler(typeof (Button), ButtonBase.ClickEvent, new RoutedEventHandler(ButtonClick));

    private void ButtonClick(object sender, RoutedEventArgs e)
    {
        if (sender != null && sender is Button)
        {
            (sender as Button).Focus();
        }
    }
于 2013-09-17T10:43:31.600 に答える
0

ブラインドメイスの回答を修正して、最初にフォーカスがあったコントロールにフォーカスを戻しました。

EventManager.RegisterClassHandler(typeof(Button), ButtonBase.ClickEvent, new RoutedEventHandler((sender, args) =>
{
    var btn = sender as Button;
    if (btn == null || ReferenceEquals(btn, Keyboard.FocusedElement))
        return;

    var originalFocus = Keyboard.FocusedElement;
    btn.Focus();
    if (originalFocus != null && originalFocus.Focusable)
        originalFocus.Focus();
}));
于 2016-07-22T01:49:36.370 に答える