0

我正在使用此处描述的方法将 ViewModel ICommand 附加到组合框的 LostFocus 事件,方法是设置CommandBehavior.RoutedEventName="LostFocus". 我预计事件会在触发绑定的同时UpdateSourceTrigger=LostFocus触发,但事实并非如此。

每当键盘选项卡离开时,或者在用户通过单击从下拉列表中实际选择一个项目后, selecteditem BindingUpdateSourceTrigger=LostFocus就会触发(不知道为什么这会导致失去焦点,但至少它会在做出选择后触发)。

只要用户单击组合框,附加的行为事件就会触发。立即地。如果使用键盘,它会正常运行,当您离开它时会触发。但是,当使用鼠标时,当控件获得焦点时触发事件,甚至在用户做出选择之前。有没有办法让这个行为像 lostfocus 对选定项目的行为一样?

编辑:我很好奇是否存在另一个答案,但我通过设置附加绑定找到了解决此问题的方法。SelectedItem 默认更新,处理正常的属性更改通知,并在 lostfocus 上更新 selectedvalue,仅处理我试图运行的命令。绑定看起来像这样:

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 回答