2012-04-10 10 views
0

Ich habe ein seltsames Verhalten mit meinem WPF ListView Control.
ListViews ItemSource ist Observable collection.die ItemSource wird regelmäßig aktualisiert.
Wenn ich einen der Artikel auswähle und dann einen anderen Artikel und keinen Artikel aktualisiere, ist alles in Ordnung.
Aber wenn ich einen Gegenstand wähle, der aktualisiert wird, während ich stehe, und dann einen anderen Gegenstand auswähle, habe ich jetzt zwei Gegenstände statt einer ausgewählt.
Wenn ich mit dem Debugger suche, sehe ich die Ereignisargumente des SelectionChanged-Ereignisses. Ich sehe, dass das hinzugefügte Element OK, aber kein entferntes Objekt ist.
Wer weiß, was das Problem ist?
Danke!Änderung der ListView-Auswahl entfernt ein altes Element nicht

Edit:

Meine beobachtbaren Sammlung:

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

Das Update genannt Methode Hexe, wenn es eine Änderung in einem gewissen Punkt ist:

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

Können Sie uns etwas Code zeigen? Wie "aktualisierst" du die Sammlung? – Jens

+0

Bitte beachten Sie die edit.Thanks – Igal

Antwort

0

Nun, offenbar war das Problem mit der überschriebenen GetHashCode() -Methode des Objektobjekts ListView. Der Hash-Code enthielt alle Felder in seiner Berechnung. Ich entfernte alle Felder (Eigenschaften) und jetzt berechnet der überschriebene GetHashCode() nur den Hash, der auf Einzelteilidentität basiert. es löste das Problem.
Ich habe auch Equals() -Methode überschrieben.
Wenn jemand weiß, warum es verwandt ist, werde ich gerne wissen.

0

Es ist wie der Kopierer Klasse sieht macht zwei Artikel in Ihrer Sammlung gleich (ich denke, dies aus der begrenzten Menge an Code oben ableiten).

Wenn zwei oder mehr Elemente in einem ListView gleich (gleich) sind, werden durch Auswahl von eins alle ausgewählt, da ein Gleichheitsvergleich in der Auswahllogik verwendet wird.

Verwandte Themen