【问题标题】:To make a ObservableCollection working with the results of an Linq expression使 ObservableCollection 使用 Linq 表达式的结果
【发布时间】:2016-07-13 04:07:15
【问题描述】:

如何使 ObservableCollection 与 Linq 表达式的结果一起工作?

例如:

items = new ObservableCollection<Item>(ctx.Items.Local.OrderBy(i => i.Name));
items.Add(new Item { Name = "ITEM NAME" });

在保存上下文的时候,上面的代码不起作用,因为:

var a items.Count; //a is 1
var b ctx.Items.Local.Count; //b is 0 --> Nothing added!!

为什么A不等于B??有人可以帮忙吗?

观察。 ctx 是一个 DBContext

【问题讨论】:

  • ctx.items 暗示这是一个数据库上下文,对吗?如果不是,ctx是什么?
  • @JohnPeters , ctx.items 是一个数据库上下文
  • 使用 ctx.items.Save(); 时会发生什么;
  • 我认为问题在于 EF 不知道 observablecollection,而是知道 List ...
  • @JohnPeters , ctx.SaveChanges() 不保存添加的项目。为什么?

标签: c# linq sql-order-by observablecollection


【解决方案1】:

我不确定你希望发生什么。 a 为 1 和 b 为 0 是我对您共享的代码的期望。

查看http://referencesource.microsoft.com/#System/compmod/system/collections/objectmodel/observablecollection.cs中ObservableCollection的源代码

您正在使用的构造函数将复制列表的内容,因此项目的任何进一步更改都不会反映在其构造函数中使用的列表中,或者在本例中为 IEnumerable。

public ObservableCollection(IEnumerable<T> collection)
{
    if (collection == null)
        throw new ArgumentNullException("collection");
    CopyFrom(collection);
}

private void CopyFrom(IEnumerable<T> collection)
{
    IList<T> items = Items;
    if (collection != null && items != null)
    {
        using (IEnumerator<T> enumerator = collection.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                items.Add(enumerator.Current);
            }
        }
    }
}

如果你想监听项目的变化,并在基本列表中反映变化,也许你可以在items.CollectionChanged中做到这一点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多