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

Xamarin Forms 重新加载数据时列表行数量值未更新问题排查

问题原因

  • 核心原因是PurchaseUnloadData.ScannedItemInfo类没有实现属性变更通知逻辑。ObservableCollection仅能感知集合本身的增/删/元素替换操作,无法感知集合内部元素的属性变更,所以修改Quantity时不会触发UI刷新。
  • 你当前的LoadData方法是直接将原有scannedItems中的对象实例重新添加到Items集合,UI框架做差异渲染优化时会识别为同一个对象,不会主动重新渲染已有条目,只有当新增了不同对象、触发全列表重绘时,旧条目的数值才会同步更新,和你观察到的现象完全匹配。

解决方法

最优方案(推荐)

给ScannedItemInfo类添加属性变更通知,继承ObservableObject并改造Quantity属性即可:

public class ScannedItemInfo : ObservableObject
{
    private int _quantity;
    public int Quantity
    {
        get => _quantity;
        set => SetProperty(ref _quantity, value);
    }

    // 其余原有属性保持不变
}

修改后只要Quantity值发生变化,就会自动通知对应UI控件刷新,不需要依赖全集合重载。

同时可以优化原有业务逻辑,避免重复三次查询同一条商品数据:

var existItem = PurchaseUnloadData.scannedItems.FirstOrDefault(x => x.ItemID == item.ItemID);
if(existItem != null)
{
    existItem.Quantity += 1;
}
else
{
    item.Quantity = 1;
    PurchaseUnloadData.scannedItems.Add(item);
}
MessagingCenter.Send<ViewPurchaseUnloadingCart>(this, "ItemsChanged");

临时兼容方案

如果无法修改ScannedItemInfo类的定义,可以修改LoadData方法,添加元素时新建实例拷贝属性,绕过UI的对象复用逻辑:

private void LoadData()
{
    Category = null;
    Items.Clear();
    foreach (var item in PurchaseUnloadData.scannedItems)
    {
        Items.Add(new PurchaseUnloadData.ScannedItemInfo
        {
            ItemID = item.ItemID,
            Quantity = item.Quantity,
            // 补充其他需要展示的属性的拷贝逻辑
        });
    }
}

内容的提问来源于stack exchange,提问作者Frosty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 02:24:02