Xamarin.Forms多Entry绑定同一TextChanged事件时如何避免非触发Entry被修改
问题根因
你现在的代码存在事件循环触发的问题:
- 当你修改Entry1的内容触发
TextChanged事件后,你在事件里给Entry2赋值的操作会再次触发Entry2的TextChanged事件 - Entry2触发的事件逻辑里又会给Entry1赋值,最终就出现了双向修改的异常结果
- 额外你当前代码的赋值内容和需求也不符:需求要求Entry1输入时Entry2填
Yess,Entry2输入时Entry1填Noo,现有代码逻辑是反过来的
修复方案
新增全局标志位判断当前是否是代码主动修改Entry内容,避免重复触发联动逻辑即可,修改后的后台代码如下:
// 新增全局标志位,标记是否是代码主动修改内容 private bool _isProgrammaticChanging = false; private async void OnEntryTextChange(object sender, TextChangedEventArgs e) { // 如果是代码主动修改的,直接跳过逻辑,避免循环触发 if (_isProgrammaticChanging) return; var EntryTapped = (Xamarin.Forms.Entry)sender; Device.BeginInvokeOnMainThread(() => { // 先把标志位设为true,代表接下来的修改是代码主动操作 _isProgrammaticChanging = true; try { if (EntryTapped.ClassId == "1") { // 符合需求:Entry1输入时Entry2填Yess myWord2.Text = "Yess"; } else if (EntryTapped.ClassId == "2") { // 符合需求:Entry2输入时Entry1填Noo myWord1.Text = "Noo"; } } finally { // 操作完成后重置标志位,恢复对用户输入的响应 _isProgrammaticChanging = false; } }); }
注意:你现有Xaml代码里第一个Entry的属性之间缺少空格,
x:Name="myWord1"TextChanged需要修改为x:Name="myWord1" TextChanged,避免出现编译异常。
内容的提问来源于stack exchange,提问作者hugo
相关产品推荐
相关产品推荐

