MAUI.NET实现类似LostFocus时更新绑定的需求与解决尝试
.NET MAUI Entry绑定仅在失去焦点时更新ViewModel属性
简介
使用MAUI.NET搭配MVVM架构,必要时可牺牲MVVM。常规实现方式:ViewModel中实现INotifyPropertyChanged的属性绑定到View里Entry的Text属性,View的BindingContext设置为该ViewModel。
需求
希望绑定仅在用户离开Entry控件(点击外部或按TAB键)时执行(即调用属性的set方法),而非默认的每输入一个字符就触发一次。
示例
用户在Entry中输入1234时,ViewModel中绑定属性的set方法会触发4次(每次按键一次),我希望仅在用户结束编辑该控件后触发一次。
尝试过的方案
这看似基础需求,我已尝试以下方法:
- 寻找WPF中
UpdateSourceTrigger="LostFocus"的等效实现 - 尝试使用
UpdateSourceEventName并指定Completed或Unfocused - 尝试手动更新绑定:已通过
Unfocused事件的参数private void Entry_Unfocused(object sender, FocusEventArgs e) { if(!e.IsFocused) { ...捕获用户离开Entry的时机,但找不到WPF中BindingOperations.GetBindingExpression的等效方法,且sender as Entry仅提供SetBinding方法,无获取绑定的方法 - 已搜索近2小时
临时解决方案
我实现了一个临时的变通方案:
- 在ViewModel中新增一个
ValueTemp属性,绑定到Entry的Text属性 - 将原ViewModel中的
Value属性绑定到Placeholder(需绑定到某个对象以触发getter,也可使用多绑定加转换器或不可见标签),并在其getter中为ValueTemp赋值 - 在
Entry_Unfocused事件中获取ValueTemp的值并赋值给原Value属性(我的场景中Completed事件未触发) - 需处理
PropertyChanged和双向同步的相关细节 - 实际代码更复杂,无法完整展示,核心是用临时属性绑定View,用户结束编辑后同步到正式属性
内容的提问来源于stack exchange,提问作者jaydopartu
相关产品推荐
相关产品推荐

