嵌套列表修改条目属性UI不更新且Json序列化报错解决方案问询
解决方案
核心问题梳理
你遇到的两个问题根源如下:
- Json序列化冲突:
ListEntry类同时存在公开的progress字段和Progress属性,Newtonsoft.Json默认大小写不敏感的序列化规则会判定二者为同名成员,抛出冲突异常 - UI无更新:XAML中绑定的是
progress字段,且你修改的也是字段,字段没有属性变更通知逻辑,不会触发UI刷新 - 你之前的推测是错误的:
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
相关产品推荐
相关产品推荐

