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

嵌套列表修改条目属性UI不更新且Json序列化报错解决方案问询

解决方案

核心问题梳理

你遇到的两个问题根源如下:

  1. Json序列化冲突:ListEntry类同时存在公开的progress字段和Progress属性,Newtonsoft.Json默认大小写不敏感的序列化规则会判定二者为同名成员,抛出冲突异常
  2. UI无更新:XAML中绑定的是progress字段,且你修改的也是字段,字段没有属性变更通知逻辑,不会触发UI刷新
  3. 你之前的推测是错误的:ListEntry是引用类型,ViewModel中绑定的Entry就是源嵌套列表中对应条目的引用,修改它的属性就是修改源数据,不需要额外查找源列表条目

具体修改步骤

1. 修复ListEntry类的序列化与通知逻辑

  • 将progress字段改为私有,避免被Json序列化扫描
  • 给Progress属性添加[JsonProperty("progress")]特性,指定与API返回的progress字段做映射
    修改后代码如下:
// 需先引入Newtonsoft.Json命名空间
public class ListEntry : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged([CallerMemberName] string name = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

    // 字段改为私有
    private int progress;
    public Media media { get; set; }

    // 指定Json映射关系
    [JsonProperty("progress")]
    public int Progress
    {
        get => progress;
        set
        {
            if (value == progress)
                return;
            progress = value;
            OnPropertyChanged();
        }
    }
    public string status { get; set; }
}

2. 修改XAML绑定路径

将progress字段的绑定改为绑定带通知的Progress属性:

<!-- 原代码 <Label Text="{Binding progress}"></Label> 替换为 -->
<Label Text="{Binding Progress}"></Label>

3. 修改命令逻辑,走属性set方法触发通知

调整加减操作的代码,修改的是Progress属性而非progress字段:

async Task Info()
{
    Console.WriteLine($"{Entry.media.Title.Romaji} +");
    // 改为修改属性,触发变更通知
    Entry.Progress++;
}
// 减操作的Info2方法同理,修改为Entry.Progress--即可

修改完成后即可实现点击按钮增减进度值,同时UI自动同步刷新,也不会再抛出Json序列化异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:39:03