2012-04-10 33 views
0

我对WPF ListView控件有奇怪的行为。
ListViews ItemSource是Observable collection.the ItemSource定期更新。
当我选择其中一个项目,然后选择其他项目并且没有项目更新时,一切正常。
但是,当我选择一个项目女巫更新,而我站在,然后选择其他项目,现在我有两个项目选择而不是一个。
当我用调试器看,我看到SelectionChanged事件的事件参数。我看到添加的项目是确定的,但没有删除项目。
任何人都知道有什么问题?
谢谢!ListView选择更改不会删除旧项目

编辑:

我观察到的集合:

protected class CustomObservableCollection : ObservableCollection<T> 
    { 
     public void Refresh() 
     { 
      ListCollectionView lcv = (ListCollectionView)(CollectionViewSource.GetDefaultView(this)); 
      lcv.Refresh(); 
     } 
    } 

调用的更新方法的女巫时,有一些项目的变化:

public void RefreshItem(T domainObject) 
    { 
     foreach (T item in obsCollection) { 
      if (!DomainObjectComparer.Equals(domainObject, item)) continue; 
      DomainObjectCopier.CopyProperties(domainObject, item); 
      obsCollection.Refresh(); 
      break; 
     } 
    } 
+0

你能告诉我们一些代码吗?你如何“更新”收藏? – Jens 2012-04-10 07:58:46

+0

请参阅edit.Thanks – Igal 2012-04-10 09:03:10

回答

0

好吧,显然问题是ListView项目对象的重写的GetHashCode()方法。哈希代码包含了它计算中的所有字段。我删除了所有字段(属性),现在重写的GetHashCode()仅根据项目的ID计算哈希。它解决了这个问题。
我也有Equals()方法重写。
如果有人知道它为什么相关,我会想知道。

0

它看起来像你的复印机类进行两次你的集合中的项目是相等的(我认为,从上面的有限数量的代码中推断出来)。

如果ListView中有两个或更多项相同(相等),则选择逻辑中使用相等比较器时,选择其中的一个将选择所有项。