WPF DataGrid自定义LessonCell控件更新后不显示问题求助
解决WPF DataGrid中自定义LessonCell控件不自动刷新的问题
你的问题核心在于数据源的变更没有正确通知到UI层,导致LessonCell控件无法自动更新显示内容,只有双击单元格触发绑定重新求值时才会加载最新数据。下面是具体的原因分析和可落地的解决方案:
问题根源
ScheduleString类未实现INotifyPropertyChanged接口:这是WPF中数据源向UI发送更新通知的基础机制,没有它,UI无法感知到属性值的变化。- 使用普通数组存储数据:数组本身不支持变更通知,当你修改数组内的元素时,WPF绑定系统无法察觉到这种变化,自然不会更新UI。
解决方案
1. 让ScheduleString实现INotifyPropertyChanged接口
修改ScheduleString类,添加属性变更通知逻辑,确保属性值变化时能主动通知UI:
using System.ComponentModel; using System.Runtime.CompilerServices; using System.Collections.ObjectModel; public class ScheduleString : INotifyPropertyChanged { public int SCHEDVARIANT_ID { get; set; } public int CLASS_ID { get; set; } public string CLASS_NAME { get; set; } public int[] SCHEDSTRING_ID { get; set; } public int[] STUDTIME_ID { get; set; } public int[] LEARNCLASS_ID { get; set; } public int[] TEACHER_ID { get; set; } public int[] SUBJECT_ID { get; set; } public int[] CABINET_ID { get; set; } private ObservableCollection<string> _teacherName; public ObservableCollection<string> TEACHER_NAME { get => _teacherName; set { _teacherName = value; OnPropertyChanged(); } } private ObservableCollection<string> _subjectName; public ObservableCollection<string> SUBJECT_NAME { get => _subjectName; set { _subjectName = value; OnPropertyChanged(); } } private ObservableCollection<string> _cabinetName; public ObservableCollection<string> CABINET_NAME { get => _cabinetName; set { _cabinetName = value; OnPropertyChanged(); } } private ObservableCollection<string> _colorHex; public ObservableCollection<string> COLOR_HEX { get => _colorHex; set { _colorHex = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 将普通数组替换为ObservableCollection<string>
ObservableCollection是WPF专门为绑定场景设计的集合类型,它会在元素添加、移除或修改时自动触发CollectionChanged事件,让绑定系统实时感知到数据变化。
3. 初始化集合属性
创建ScheduleString实例时,记得初始化这些ObservableCollection属性,避免空引用异常:
var newScheduleItem = new ScheduleString { TEACHER_NAME = new ObservableCollection<string>(), SUBJECT_NAME = new ObservableCollection<string>(), CABINET_NAME = new ObservableCollection<string>(), COLOR_HEX = new ObservableCollection<string>(), // 其他属性初始化... }; ScheduleStringCollection.Add(newScheduleItem);
4. 原有绑定代码无需修改
ObservableCollection支持索引访问,你之前写的绑定路径(比如TEACHER_NAME[cellNumber])依然有效,不需要做任何改动:
lessonCell.SetBinding(LessonCell.TeacherNameProperty, new Binding("TEACHER_NAME[" + cellNumber + "]") { Mode = BindingMode.TwoWay, NotifyOnTargetUpdated = true, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
为什么双击单元格会显示更新?
当你双击单元格时,DataGrid会进入编辑模式,这个过程会强制重新求值绑定表达式,从而获取到最新的元素值。而我们的解决方案是让数据源主动推送更新通知,不需要依赖用户交互触发UI刷新。
内容的提问来源于stack exchange,提问作者Nineor
相关产品推荐
相关产品推荐

