当 DataContext 发生更改时,WPF ObservableCollection 不会更新

本文关键字:ObservableCollection WPF 更新 DataContext | 更新日期: 2023-09-27 17:56:56

我有Data = new ObservableCollection<DATA>(dataContext.DATA);

dataContext是我的实体。 DATA是 SQL Server 表。

现在我运行导入方法,该方法填充DATA SQL Server 上的表:

    public static void Import(DataTable table)
    {
        var dataContext = DataContext.Instance.Entities;
        foreach (DataRow row in table.Rows)
        {
            .......
            var dataRow = new DATA
            {
               .........
            };
            dataContext.AddToDATA(dataRow);
        }
        dataContext.SaveChanges();
    }

但是我的可观察集合Data仍然是空的。如何更新?

当 DataContext 发生更改时,WPF ObservableCollection 不会更新

ObservableCollection<T> Constructor (IEnumerable<T>)

初始化 ObservableCollection 类的新实例,该实例 包含从指定集合复制的元素。

这里的关键字是它从集合中复制元素。之后,它不会保留与您传入的枚举的任何同步。您的代码正在更新dataContext对象,而不是您的Data对象(可观察集合)。您必须构建自己的 ObservableCollection 同步版本,或者创建方法来使它们保持同步。

如果您不关心保持dataContext对象同步,而只想在一次性加载中使用它,那么在 ObservableCollection 的构造函数中使用它之前,您必须在该枚举中拥有所有适当的对象。

我的猜测是你做了类似于以下内容的事情:

Data = new ObservableCollection<DATA>(dataContext.DATA)
// Afterwards...
Import(foobar);

它应该是:

Import(foobar);
// Afterwards...
Data = new ObservableCollection<DATA>(dataContext.DATA)

您需要从数据上下文中重新获取数据,并在此时将其添加到可观察集合中。

public static void Import(DataTable table)
{
    var dataContext = DataContext.Instance.Entities;
    foreach (DataRow row in table.Rows)
    {
        .......
        var dataRow = new DATA
        {
           .........
        };
        dataContext.AddToDATA(dataRow);
    }
    dataContext.SaveChanges();
    var data = datContext.whateverretreval();
    Data = data;
}