0

ここで説明する方法を使用して、ViewModel ICommand を Combobox の LostFocus イベントにアタッチしますCommandBehavior.RoutedEventName="LostFocus"。バインディングの発生と同時にイベントが発生することを期待しUpdateSourceTrigger=LostFocusていましたが、そうではありませんでした。

selecteditem BindingUpdateSourceTrigger=LostFocusは、キーボードのタブが離されるたびに、またはユーザーが実際にクリックしてドロップダウンから項目を選択した後に発生します (これが原因でフォーカスが失われる理由はわかりませんが、少なくとも選択が行われた後に発生します)。

添付された動作イベントは、ユーザーがコンボボックスをクリックするたびに発生します。すぐに。キーボードを使用している場合は通常どおり動作し、タブから離れると発火します。ただし、マウスを使用している場合、ユーザーが選択を行う前に、コントロールがフォーカスされるとイベントが発生します。選択した項目に対して lostfocus が行うようにこれを動作させる方法はありますか?

編集:別の答えが存在するかどうかは興味がありますが、追加のバインディングを設定することで、この問題を回避する方法を見つけました。SelectedItem はデフォルトで更新され、通常のプロパティ変更通知を処理し、selectedvalue は lostfocus で更新され、実行しようとしていたコマンドのみを処理します。バインディングは次のようになります。

SelectedItem="{Binding Path=SelectedCustomer, Mode=TwoWay}"
                  SelectedValuePath="CM_CUSTOMER_ID"
                  SelectedValue="{Binding Path=CustomerLostFocus, UpdateSourceTrigger=LostFocus}"
4

1 に答える 1

0

LostFocusイベントのイベント引数の OriginalSource を確認する必要があります。

LostFocus イベントはバブリング イベントです。これは、オブジェクト ツリー内の親子関係によって接続された一連のオブジェクトに対して複数の LostFocus イベント ハンドラーが登録されている場合、そのイベントはその関係にある各オブジェクトによって受信されることを意味します。バブリングの比喩は、イベントが入力条件を直接受け取ったオブジェクトから始まり、オブジェクト ツリーを上っていくということを示しています。バブリング イベントの場合、イベント ハンドラーが使用できるセンダーは、イベントが処理されるオブジェクトを識別します。必ずしも、イベントを開始した入力条件を実際に受け取ったオブジェクトを識別する必要はありません。イベントを開始したオブジェクトを取得するには、イベントの RoutedEventArgs イベント データの OriginalSource 値を使用します。

したがって、ComboBox の場合、ComboBox 内のさまざまなフォーカス可能な要素のイベントを受け取ることができます。

于 2011-08-17T17:54:31.387 に答える