删除ObservableCollection中的一个Item

我有一些方法,如:

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

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

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

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

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

 public void RemoveItem(ObservableCollection collection, SomeClass instance) { collection.Remove(collection.Where(i => i.Id == instance.Id).Single()); } 

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

如果您要删除的项目具有类似代码/ ID的内容,您可以将其与其他项目进行比较,您可以执行以下操作:

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

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

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

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

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

关于msdn的更多相关信息: Object.Equals方法(对象)