iOS项目中MvvmCross绑定Dictionary到TableViewCell的问题
解决MvvmCross TableView绑定Dictionary数据源的Cell数据绑定问题
你遇到的核心问题是TableSource没有把正确的Item实例传递给Cell,导致Mvx绑定的时候拿到的是字典的KeyValuePair<string, List<Item>>,而非你需要的Item对象,所以才会出现找不到Name属性的报错。下面是具体的修复步骤:
1. 重写TableSource的GetItem方法
MvxTableViewSource默认的GetItem方法无法正确处理Dictionary<string, List<Item>>这种嵌套结构,你需要手动实现它来返回对应分区和行的Item实例:
public override object GetItem(NSIndexPath indexPath) { // 获取当前分区对应的Item列表 var sectionItemList = savedItemList.ElementAt(indexPath.Section).Value; // 返回当前行的Item return sectionItemList[indexPath.Row]; }
2. 修正GetOrCreateCellFor方法
确保Cell的DataContext设置为正确的Item对象(虽然Mvx通常会自动处理,但显式设置更稳妥):
protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item) { NSString cellIdentifier = CellsIdentifier.Key; var cell = (MyTableViewCell)TableView.DequeueReusableCell(cellIdentifier, indexPath); // 把Item实例设置为Cell的DataContext cell.DataContext = item; return cell; }
报错原因解析
你之前的代码里,TableSource没有正确提供Item作为绑定源,Mvx默认拿到的是字典的键值对(KeyValuePair),而你的Cell绑定的是Item.Name,自然找不到对应的属性,所以出现了Unable to bind: source property source not found Property:Name on KeyValuePair2`的警告。
关于Cell绑定的验证
你的MyTableViewCell代码是正确的,已经配置好了和Item的绑定逻辑:
this.DelayBind(() => { var set = this.CreateBindingSet<MyTableViewCell, Item>(); set.Bind(LBL_NAME) .To(item => item.Name) .Apply(); });
只要确保Cell的DataContext是Item实例,这个绑定就会正常工作,LBL_NAME会正确显示Item的名称。
内容的提问来源于stack exchange,提问作者Swisscheese
相关产品推荐
相关产品推荐

