Xamarin移除列表项后如何更新Preferences中存储的对应列表数据
问题核心原因
你当前的尝试代码存在两个典型问题:
- 从
Preferences反序列化得到的getcart是独立的新列表实例,其中的元素和待删除的itemcart属于不同引用,如果CartUser类没有重写Equals方法,getcart.Remove(itemcart)会匹配不到对应条目,直接删除失败 - 同时操作ViewModel的列表和本地读取的临时列表,很容易出现两边数据不一致的问题
最优解决方法
既然执行RemoveItemCart命令后,ViewModel中的CartUsers列表已经完成了条目删除,直接拿这个已经更新的最新列表序列化后存入Preferences即可,不需要再重复读取本地旧数据修改,逻辑更简洁也不会出现数据不一致:
private void removeitem_Clicked(object sender, EventArgs e) { var button = sender as ImageButton; var itemcart = button.BindingContext as CartUser; // 执行ViewModel移除逻辑,更新内存中的CartUsers列表 cartUserViewModel.RemoveItemCart.Execute(itemcart); // 直接把内存中最新的CartUsers同步到本地存储 Preferences.Set("CartUser", JsonConvert.SerializeObject(cartUserViewModel.CartUsers)); }
兼容原有逻辑的修改方案
如果你需要保留读取本地旧数据修改的逻辑,把直接按引用删除改成按唯一标识匹配删除即可,比如CartUser包含唯一字段Id:
private void removeitem_Clicked(object sender, EventArgs e) { var mycart = Preferences.Get("CartUser", "defaultcart"); var getcart = JsonConvert.DeserializeObject<List<CartUser>>(mycart); var button = sender as ImageButton; var itemcart = button.BindingContext as CartUser; cartUserViewModel.RemoveItemCart.Execute(itemcart); // 按唯一标识匹配要删除的条目,避免引用不同导致删除失败 var target = getcart.FirstOrDefault(x => x.Id == itemcart.Id); if (target != null) { getcart.Remove(target); Preferences.Set("CartUser", JsonConvert.SerializeObject(getcart)); } }
额外注意
- 请保证ViewModel中的
CartUsers是ObservableCollection类型,删除条目后UI会自动同步刷新 - 无特殊需求优先使用第一种方案,维护成本更低
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

