.NET MAUI MVVM:Entry失焦时通过ReturnCommand获取更新值异常
解决.NET MAUI Entry ReturnCommand触发时绑定属性未更新的问题
问题根因
默认情况下,Entry的Text属性使用TwoWay绑定时,更新ViewModel属性的时机是LostFocus(输入框失去焦点)。而ReturnCommand在用户按下回车键时立即触发,此时输入框焦点尚未真正转移,导致ViewModel中的NumberBoxBuy还未同步到最新输入值。
可行解决方案
方案1:修改绑定的更新触发时机
直接在XAML绑定中指定UpdateSourceTrigger为PropertyChanged,让输入框文本每变化一次就同步更新到ViewModel:
<Entry Placeholder="Cantidad Cajas" Text="{Binding NumberBoxBuy, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ReturnCommand="{Binding EntryCompletedCommand}" ClearButtonVisibility="WhileEditing"/>
此方案适合需要实时同步输入内容的场景,触发ReturnCommand时能直接拿到最新值。
方案2:触发命令前手动强制更新绑定
若不想频繁同步输入内容(比如输入长数字时),可在Completed事件中手动触发绑定更新,再执行命令:
- 给Entry命名并保留原有绑定:
<Entry x:Name="BoxBuyEntry" Placeholder="Cantidad Cajas" Text="{Binding NumberBoxBuy, Mode=TwoWay}" ReturnCommand="{Binding EntryCompletedCommand}" ClearButtonVisibility="WhileEditing"/>
- 在页面代码隐藏中添加事件处理:
public YourPage() { InitializeComponent(); BoxBuyEntry.Completed += (s, e) => { // 强制同步输入框值到ViewModel BoxBuyEntry.GetBindingExpression(Entry.TextProperty)?.UpdateSource(); }; }
方案3:封装自定义Entry控件
如果多个页面需要此逻辑,可封装一个自动更新绑定的自定义Entry:
public class AutoUpdateEntry : Entry { protected override void OnCompleted() { // 先同步绑定源,再执行默认Completed逻辑 GetBindingExpression(TextProperty)?.UpdateSource(); base.OnCompleted(); } }
在XAML中引用自定义控件即可:
<local:AutoUpdateEntry Placeholder="Cantidad Cajas" Text="{Binding NumberBoxBuy, Mode=TwoWay}" ReturnCommand="{Binding EntryCompletedCommand}" ClearButtonVisibility="WhileEditing"/>
验证效果
采用任意方案后,触发ReturnCommand时,ViewModel的EntryCompleted方法中即可输出最新的NumberBoxBuy值。
内容的提问来源于stack exchange,提问作者Luis Julio
相关产品推荐
相关产品推荐

