【问题标题】:WPF ObservableCollection hasn't updated when DataContext has changedDataContext 更改时 WPF ObservableCollection 未更新
【发布时间】:2013-01-31 17:09:55
【问题描述】:

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

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

现在我运行 Import 方法,它填充 SQL Server 上的 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();
    }

但我的 ObservableCollection Data 仍然是空的。如何更新?

【问题讨论】:

标签: c# wpf entity-framework mvvm observablecollection


【解决方案1】:

ObservableCollection<T> Constructor (IEnumerable<T>):

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

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

如果您不关心保持dataContext 对象同步并且只想在一次性加载中使用它,那么您必须在该枚举中包含所有适当的对象,然后才能在您的构造函数中使用它ObservableCollection。

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

Data = new ObservableCollection<DATA>(dataContext.DATA)

// Afterwards...
Import(foobar);

应该是:

Import(foobar);

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

【讨论】:

  • 感谢您的回答,它非常有用。应用程序的结构有点复杂。 Data 集合属于 DocumentViewModel,但我从 DashboardViewModel 运行 Import(foobar):用户按下导入按钮 -> DashboardViewModel 的 RelayCommand -> 导入(foobar)。实际上,我无法访问来自DashboardViewModelData 集合。你对我的情况有什么建议? DocumentViewModel也有后代
  • 我正在考虑使用MessengerDocumentViewModel 的所有后代广播一条消息,以更新他们的Data 集合,但我不确定这个解决方案不会影响到性能...
【解决方案2】:

您需要从 datacontext 中重新获取数据并将其添加到此时的 observable 集合中。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-02
    • 2014-01-01
    • 2014-01-15
    • 2019-10-25
    • 2014-11-05
    • 1970-01-01
    • 2017-08-31
    相关资源
    最近更新 更多