关于 mvvm:WPF lostfocus 在按下按钮时不会触发

WPF lostfocus not firing when pressing a button

这是用于输入/选择 IP 的可编辑组合框的 XAML 代码。

1
2
3
4
5
6
7
8
9
10
<ComboBox Name="ComboBoxServerIp"
    Grid.Row="2"  Grid.Column="1"                                                            
    ItemsSource="{Binding ServerList}"          
    Text="{Binding SelectedServer, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"
    IsEditable="True" IsReadOnly="False">
    <ComboBox.InputBindings>
        <KeyBinding Command="{Binding UpdateServerIpCommand}" Key="Enter"
                    CommandParameter="{Binding ElementName=ComboBoxServerIp ,Path=Text}"/>
    </ComboBox.InputBindings>  
</ComboBox>

一旦用户完成输入 IP,它就会触发一个大约需要 10 秒的流程。所以我使用了 lostfocus 和 enter 键的组合来触发更新。

除了用户在没有首先失去焦点或按下回车的情况下按下按钮的用例之外,这工作正常。在这种情况下,在执行按钮的命令之前不会触发 SelecterServer 更新。该命令读取旧的 SelectedServer 值。不是 UI

中的那个

tl;dr - 在 UI 中按下按钮时,文本框中不会触发 lostfocus 事件。
如何从 UI 端强制更新?


找到了一个完全相反问题的帖子,
同一控件中的 WPF 失焦问题。

令人惊讶的是,与该修复相反的方法对我来说效果很好
将此属性添加到按钮:

1
Focusable="False"

lostFocus 事件在按钮点击事件之前触发。一切都按预期进行。


你在ViewModel中实现了INotifyPropertyChanged接口吗?这可能有助于解决您的问题。我有一个类似的问题,我将一些数据输入到 TextBox 中,然后不单击其他任何地方,我会单击会触发命令的按钮,但我总是在属性中拥有旧值,而不是来自 UI 的值。一旦我实现了 INotifyPropertyChanged 接口,它就可以正常工作了。


我有同样的情况,我使用 Telerik 的 Grid 和 Themes,我遇到了同样的问题,我的 GridViewComboBoxColumn 在触发 Button 的点击事件之前不会更新值,你必须点击其他任何地方之前,否则数据将不会被保存。

在我的例子中,我有 DanW25\\'s awnser 的对面,并且我已将我的 Buttons Focusable 属性设置为 False 以解决主题中的某些问题。我将 Save 按钮的 Focusable 属性设置为 True,现在一切正常。


试试这个

1
Text="{Binding SelectedServer, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"

或者如果这不是一个选项,那么可能是这个答案上的附加属性
WPF - 单击按钮时设置焦点 - 没有代码