Ich habe Google und hier nach Antworten gesucht, mein Problem ist etwas mit der folgenden Frage verwandt, aber anders genug, um eine neue Frage zu rechtfertigen.WPF: Combobox verlieren ausgewählten Index nach gebundenen ItemSource Sammlung Änderungen
Combo-box loses selection after collection changes
Im Grunde habe ich eine WPF-Combobox, die zu einer ObservableCollection-Klasse gebunden ist. Diese Klasse verfügt über zusätzliche Funktionen, um Benachrichtigungen über Sammeländerungen zu verzögern, wenn ich eine Reihe von Änderungen vornehmen muss, z. B. Löschen und Neubefüllen, um einen neuen Snapshot der Datenbank zu erhalten.
Meine Combobox-Bindung hat DisplayMemberPath und SelectedValuePath festgelegt. Der SelectedValuePath wird in eine Integer-Eigenschaft aufgelöst.
Das Problem ist das gleiche wie die referenzierte Frage, wenn ich die Werte in der gebundenen Sammlung aktualisieren, verliert die gebundene ComboBox ihre Auswahl und wird leer (SelectedIndex = -1).
Ich kann bestätigen, dass das CollectionChanged-Ereignis nicht ausgelöst wird, bis die Sammlung erneut ausgefüllt wurde und die Elemente wieder darin enthalten sind.
Mehr rätselhaft ist, wenn ich folgendes tun:
using (_collection.DelayNotifications())
{
var items = _collection.ToArray();
_collection.Clear();
_collection.AddRange(items);
}
Die Combobox hat nicht seinen gewählten Wert verlieren.
Das schlägt vor, dass es bricht, wenn die Elemente in der Sammlung durch neue Elemente aus der Datenbank ersetzt werden - ich könnte dies akzeptieren, wenn ich nicht die SelectedValuePath-Bindung verwendet habe, sondern weil ich bin und die Integer-Werte sind das gleiche, sicherlich was ich mache, sollte funktionieren?
ich Ideen habe .NET 3.5 SP1
Wer bin mit?
bearbeiten
Aus den Kommentaren unten und Antwort des Blam. Ich akzeptiere, dass das die Gründe sind warum es tut es. Aber es hilft mir nicht wirklich.
Ich binde die SelectedValue-Eigenschaft der Combobox an eine Integer-Eigenschaft in meinem Ansichtsmodell. Wenn ich das SelectedItem binden wollte, müsste ich an eine Eigenschaft dieses Objekttyps in meinem Ansichtsmodell binden - aber es ist die Integer-Eigenschaft, nach der ich eigentlich suche.
Im Moment habe ich das Problem "behoben" (lesen Sie kleinere Hack), indem Sie eine Eigenschaft geändert Ereignis für die Eigenschaft 'SelectedValue' gezwungen ist. Dies scheint zu bewirken, dass die Combobox ihre interne Liste nach einem Element überprüft, das mit dem definierten SelectedValuePath übereinstimmt.
Die WPF-Combobox muss "wissen", dass sie einen SelectedValuePath-Wert gesetzt hat, daher halte ich es nicht für einen großen Sprung, anzunehmen, dass sie ihre Item-Matching-Logik anpassen würde. Dies geht jedoch außerhalb des für SO vorgesehenen Anwendungsbereichs.
Ich realisiere, ich werde wahrscheinlich nur akzeptieren, das ist nur, wie WPF funktioniert, aber nach dem Kampf mit Daten gebundenen Comboboxen in WinForms für ein paar Jahre, ich hoffte irgendwie, ich hätte nicht mit WPF :) Obwohl WPF Comboboxes viel besser sind als WinForms.
ValuePath spielt keine Rolle, wenn es sich um ein anderes Objekt handelt ... Sie können nicht erwarten, dass die Bindung beibehalten wird, da sie an bestimmte Insanzen (Objekte) gebunden ist. Sobald Sie diese entfernen, geht die Bindung verloren ... – UIlrvnd
Die von DelayNotificatons() zurückgegebene Methode des Objekts löst das CollectionChange-Ereignis mit dem ListReset-Flag aus. Ich würde immer noch davon ausgehen, dass die Combobox durch ihre neue Liste nach einem Integerwert suchen würde, auf den sie passt ... Wenn das nicht passiert, was sind meine Optionen? – Marlon
In Ihrem Codebeispiel verwenden Sie dieselben Instanzen, da Sie nur die Sammlungen manipulieren. es wird nicht aussehen, da die ganze Zahl eine andere Instanz ist, obwohl es ** den gleichen Wert hat ... Hoffe, es macht sence lol ... – UIlrvnd