如果 ObservableCollection 在启动时为 null,则 DataGrid 在刷新后不会显示数据

本文关键字:刷新 显示 数据 DataGrid 启动 ObservableCollection 如果 null | 更新日期: 2023-09-27 17:56:46

希望我能说清楚。 我有一个数据网格

<DataGrid Grid.Row="6" Grid.Column="1"
            AutoGenerateColumns="False"
            CanUserAddRows="False"
            CanUserDeleteRows="False"
            ItemsSource="{Binding projectEntriesForEmployee}">

绑定到

    public ObservableCollection<ProjectEntry> projectEntriesForEmployee { 
        get { return (ObservableCollection<ProjectEntry>)GetValue(projectEntriesForEmployeeProperty); }
        set { SetValue(projectEntriesForEmployeeProperty, value); }
    }
    public DependencyProperty projectEntriesForEmployeeProperty = DependencyProperty.Register("projectEntriesForEmployee", typeof(ObservableCollection<ProjectEntry>), typeof(MainWindowVC));

如果我在加载 UserControl(我这样做是为了调试)之前设置了 projectEntriesForEmployee,我的行会在 DataGrid 中正确显示。 但是,如果在用户控件加载时 projectEntriesForEmployee 为 null,则当我将 projectEntriesForEmployee 设置为包含列表中的项的有效 ObservableCollection 时(基于事件),DataGrid 上不显示任何行。 这是怎么回事?

编辑:我试过了

CollectionViewSource.GetDefaultView(projectEntriesForEmployee).Refresh();

但没有快乐。

如果 ObservableCollection 在启动时为 null,则 DataGrid 在刷新后不会显示数据

我不确定发生了什么,但我会尝试使用 Snoop 钻取到 DataGrid,并确保在更新projectEntriesForEmployeeProperty后,DataGridDataContext仍设置为适当的对象并验证ItemsSource上的绑定。如果存在任何绑定错误,Snoop 将显示这些错误,它还会让你钻取到对象并查看完整的绑定表达式。只是一个建议。

加载控件时,OC 和 DataGrid 的 ItemsSource 都指向同一件事:空内存。

一段时间后,您将 OC 初始化为集合。 现在,OC 保存了一个集合,但 DataGrid 的 ItemSource 仍指向相同的空内存段。

您不能只在控件的构造函数中初始化 OC 吗?

编辑

我不是 WPF 大师,所以这样做可能是有原因的,但为什么要将 ObservableCollection 设置为依赖项属性? 如果您所做的只是将其绑定到 DataGrid 的 ItemsSource,则常规的普通 C# 属性将正常工作,并且仍提供在向集合添加或删除集合时发生的所有自动更新。

对不起大家。 我已经回答了我自己的问题,因为事实证明问题出在依赖项属性所有者类型上。 我把它作为MainWindowVC。 它应该是TimeEntryVC。 一旦我更改了它,我就注释掉了在控制器类中重置 ItemsSource,一切都按预期工作。 所以@Tim,你是对的,绑定系统负责处理事情;我只是告诉它在错误的类中寻找属性。 无论如何,谢谢大家,因为我现在比以前更了解幕后发生的事情。