You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin移除列表项后如何更新Preferences中存储的对应列表数据

问题核心原因

你当前的尝试代码存在两个典型问题:

  1. 从Preferences反序列化得到的getcart是独立的新列表实例,其中的元素和待删除的itemcart属于不同引用,如果CartUser类没有重写Equals方法,getcart.Remove(itemcart)会匹配不到对应条目,直接删除失败
  2. 同时操作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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:45:02