删除ObservableCollection中的一个Item

时间:2013-12-05 14:53:37

标签: c# .net wpf

我有一些方法,如:

public void RemoveItem(ObservableCollection<SomeClass> collection, SomeClass instance)
{
    if(collection.Contains(instance))
    {
        collection.Remove(instance);
    }
}

首先,即使集合包含实例,if句子仍然会返回false

其次,我删除了if句子,只是让集合可以删除实例。并且在执行之后,集合仍保留其原始项目,其中仍包含实例。

是引用问题,但如何解决?我只是想从ObservableCollection中删除一个项目并保持其Observable功能(让我困惑here )。

3 个答案:

答案 0 :(得分:20)

您的问题是您正在尝试从不在该集合中的集合中删除对象。它可能具有相同的属性值,但它不是同一个对象。如果您的对象具有唯一可识别的属性,例如Id

,则有一种简单的方法
public void RemoveItem(ObservableCollection<SomeClass> collection, SomeClass instance)
{
    collection.Remove(collection.Where(i => i.Id == instance.Id).Single());
}

我们的想法是,我们从集合中获取实际项,然后将其传递到Remove方法。

答案 1 :(得分:4)

如果您打算删除的项目类似于代码/如果您可以与其他项目进行比较,则可以执行以下操作:

foreach (var item in itemSet)
{
  if (item.ItemID == itemToCompareTo.ItemID)
  {
    itemSet.Remove(item);
    break;
  }
}

答案 2 :(得分:2)

确实,这似乎是一个参考问题。 您可能必须重写Equals(和GetHashCode)方法,以便ObservableCollection能够找到实例,即使它不是相同的引用。

原因是因为Equals()方法的默认实现检查两个对象是否具有相同的引用。

注意:重写Equals方法时要小心。您还必须重写GetHashCode,因为GetHashCode()方法的默认实现基于对象的引用返回一个整数,而不是基于对象的实例(和类)变量的值。

无论其实例变量(数据字段)的值发生多少次更改,默认实现计算的哈希代码在对象生命周期内都不会更改。这就是为什么当你重写Equals()方法时我们总是实现GetHashCode()。

关于msdn:Object.Equals Method (Object)

的更多相关信息