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

WPF DataGrid自定义LessonCell控件更新后不显示问题求助

解决WPF DataGrid中自定义LessonCell控件不自动刷新的问题

你的问题核心在于数据源的变更没有正确通知到UI层,导致LessonCell控件无法自动更新显示内容,只有双击单元格触发绑定重新求值时才会加载最新数据。下面是具体的原因分析和可落地的解决方案:

问题根源

  1. ScheduleString类未实现INotifyPropertyChanged接口:这是WPF中数据源向UI发送更新通知的基础机制,没有它,UI无法感知到属性值的变化。
  2. 使用普通数组存储数据:数组本身不支持变更通知,当你修改数组内的元素时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:23:23