我有一些方法,如:
public void RemoveItem(ObservableCollection<SomeClass> collection, SomeClass instance)
{
if(collection.Contains(instance))
{
collection.Remove(instance);
}
}
首先,即使集合包含实例,if
句子仍然会返回false
。
其次,我删除了if句子,只是让集合可以删除实例。并且在执行之后,集合仍保留其原始项目,其中仍包含实例。
是引用问题,但如何解决?我只是想从ObservableCollection中删除一个项目并保持其Observable功能(让我困惑here )。
答案 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()。
的更多相关信息