Xamarin IValueConverter求助:判断字符串是否与列表项字段相等
Xamarin IValueConverter 实现修正方案
需求说明
实现一个IValueConverter,输入字符串若匹配列表(来自JSON响应)中某一项的指定字符串字段,则返回该字段值;否则返回原字符串。
现有代码问题分析
- 转换器类中
companyListA未定义,也没有接收外部加载数据的逻辑,无法访问城市列表 - 循环中错误使用
companyListA.NameString,应使用循环变量item.NameString RetornaCiudad为异步方法,但没有将加载的列表传递给转换器的机制- 类命名不符合C# PascalCase规范
修正后代码实现
转换器类
public class CityConverter : IValueConverter { // 用于存储加载的城市列表 public List<CiudadApi> CityList { get; set; } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { // 空值或非字符串输入直接返回原数据 if (value is not string cityInput || CityList == null) return value; // 查找匹配的城市项 var matchedCity = CityList.FirstOrDefault(item => item.NameString == cityInput); // 匹配到返回字段值,否则返回原输入 return matchedCity?.NameString ?? cityInput; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
数据加载与转换器赋值
// 示例:在页面ViewModel或代码后台中实现 private CityConverter _cityConverter; public async Task LoadCityData() { _cityConverter = new CityConverter(); using var httpClientCD = new HttpClient(); var resultJsonCD = await httpClientCD.GetStringAsync("URLSTRING"); var ciudadList = JsonConvert.DeserializeObject<CiudadApi[]>(resultJsonCD); // 将加载的列表绑定到转换器 _cityConverter.CityList = ciudadList.ToList(); // 若在XAML中绑定转换器,需更新绑定上下文或重新设置转换器实例 // 例如:YourControl.SetBinding(Label.TextProperty, new Binding("CityName") { Converter = _cityConverter }); }
关键修正点
- 给转换器添加
CityList属性,实现外部数据注入 - 使用
FirstOrDefault简化查找逻辑,替代低效的foreach循环 - 增加空值判断,避免空引用异常
- 异步方法改为返回
Task(异步void仅用于事件处理场景) - 修正列表项访问错误,改用
item.NameString - 类名调整为符合C#规范的
CityConverter
内容的提问来源于stack exchange,提问作者Oswaldo Roosemberg
相关产品推荐
相关产品推荐

