Grid重排序后未移动项未更新问题排查
问题原因
核心问题是你的实体类未实现INotifyPropertyChanged接口。
ObservableCollection的CollectionChanged事件仅会通知UI集合结构的变化(比如项的增删、移动),但集合内单个对象的属性变更,需要对象自身触发属性变更通知,UI才会刷新。你现在只是修改了Key属性的值,却没给UI传递属性变更的信号,因此除了被移动的项(集合结构变化触发了UI重绑),其他项的Key不会更新。
解决方案
给实体类实现
INotifyPropertyChanged接口
假设你的实体类名为MyItem,修改代码如下:public class MyItem : INotifyPropertyChanged { private int _key; public int Key { get => _key; set { if (_key != value) { _key = value; OnPropertyChanged(nameof(Key)); } } } public string Text { get; set; } // 你的string类型属性,建议同样添加属性变更通知 public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }保留原有的CollectionChanged事件处理逻辑
你原本遍历更新Key的代码逻辑是正确的,现在实体类支持属性变更通知后,修改Key时会自动触发UI刷新,所有项的Key都会同步更新。
补充说明
绑定模式OneWay是可行的,只要属性变更通知触发,OneWay绑定会自动更新UI显示。之前仅移动的项更新,是因为该项的位置变化触发了UI的重新绑定,而其他项的属性变更没有通知机制,导致UI保留旧值。
内容的提问来源于stack exchange,提问作者Pierresa
相关产品推荐
相关产品推荐

