WPF MVVM模式下点击保存按钮无法捕获文本框最新内容问题咨询
问题根因
WPF中TextBox的Text属性默认绑定更新触发时机为UpdateSourceTrigger.LostFocus,只有文本框失去焦点时才会将输入值同步到绑定的ViewModel属性。直接点击保存按钮时如果按钮没有抢占到焦点,文本框就不会触发失焦事件,自然不会执行属性的Set方法。
解决方案(按简洁程度排序)
方案1:修改绑定更新触发时机(侵入性最低)
直接修改TextBox的绑定配置,显式指定UpdateSourceTrigger=PropertyChanged,用户每输入一个字符都会实时同步到ViewModel属性,完全不需要依赖失焦事件:
<TextBox Text="{Binding SomeText, UpdateSourceTrigger=PropertyChanged}"/>
如果项目里有大量文本框需要统一处理,可以在App.xaml中添加全局附加行为,批量修改所有文本框的绑定触发规则,不需要逐个改XAML。
方案2:保存前主动清空焦点(不修改原有绑定规则)
如果不想改动原有绑定逻辑,可以在执行保存操作前主动清除当前键盘焦点,触发文本框的失焦事件,让未同步的输入自动更新到ViewModel:
如果要遵守MVVM分离原则,可以把这段逻辑写在保存按钮的Click事件后置代码中,再触发绑定的命令即可:
// 清除当前键盘焦点,触发所有未提交的绑定更新 Keyboard.ClearFocus(); // 原有保存逻辑
需要更兼容的写法也可以手动转移焦点:
if (Keyboard.FocusedElement is UIElement focusedElement) { focusedElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.First)); }
方案3:修改保存按钮配置抢占焦点
给保存按钮显式设置Focusable="True",保证点击按钮时自动抢占焦点,触发文本框的失焦事件:
<Button Command="{Binding SaveCommand}" ToolTip="Save" Focusable="True"> </Button>
该方案不需要改动其他逻辑,仅需修改按钮的XAML配置即可生效。
内容的提问来源于stack exchange,提问作者Just another Dev
相关产品推荐
相关产品推荐

