Ich habe einen Kampf mit einer ComboBox in einer WPF-App. Es ähnelt einigen anderen Fragen, aber die klassische Lösung für dieses Problem scheint nicht zu funktionieren.WPF ComboBox-Einstellung auf Null nach ItemsSource aktualisiert
Im Wesentlichen ist es das gleiche Problem wie folgt aus:
WPF ComboBox SelectedItem Set to Null on TabControl Switch
jedoch meine Itemssource ist bereits in der XAML nach dem SelectedItem, das ist das, was normalerweise diese aussortiert.
Was passiert, ist, dass ich eine Ansicht mit der Combobox darauf mit Daten bereits geladen habe, dann wird ein Ereignis ausgelöst, das die Dateneinspeisung in die ComboBox aktualisiert. Das ViewModel konsumiert das Ereignis (ausgelöst durch einen BackgroundWorker, der die Daten abruft) und aktualisiert seine ObservableCollection, die ItemsSource, mit den neuen Daten. Wie folgt aus:
int id = (int)Invoice.Customer.DatabaseID;
Customers = new ObservableCollection<Customer>(customers);
Invoice.Customer = Customers.FirstOrDefault(x => x.DatabaseID == id);
Wie Sie sehen können ist es, den Kunden auf der Rechnung zu setzen versucht, zurück zu dem, was es ursprünglich war. Dies geschieht jedoch, beobachtet mit einem Unterbrechungspunkt, sobald dies abgeschlossen ist, wird der Kunde von einer nicht identifizierten Quelle auf Null zurückgesetzt (keiner meiner Codes erscheint in der Aufrufliste, es ist alles Framework-Zeug).
Die XAML für die ComboBox ist dies:
<ComboBox DisplayMemberPath="AccountCode"
SelectedItem="{Binding Invoice.Customer, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
ItemsSource="{Binding Customers}"/>
So wird meine ComboBox zusammenzufassen SelectedItem auf null gesetzt, nachdem der Itemssource aktualisiert wird und gewährleistet ist nach Itemssource SelectedItem nichts tut. Ich kann wirklich nicht herausfinden, warum es auf Null gesetzt wird und ich bin mir nicht sicher, wo ich hinschauen soll. Irgendwelche Hinweise oder Dinge, die ich betrachten kann, um eine Lösung zu finden, würde sehr geschätzt werden.
EDIT: Ok, ich habe damit ein bisschen mehr gespielt und ich vermute, dass es etwas mit dem Update von einem BackgroundWorker zu tun hat. Ich verwende einen Timer und einen BackgroundWorker in meinem Datendienst, um die Kundenliste regelmäßig von der Datenbank zu aktualisieren, um sicherzustellen, dass die Daten relativ aktuell sind. Der BackgroundWorker löst nach dem Beenden ein Ereignis aus, um interessierte Objekte darüber zu informieren, dass die Liste aktualisiert wurde. Dies scheint zu bedeuten, dass wenn die Ereignisse verbraucht werden, sie sich in einem anderen Thread befinden. Wenn es auf diese Weise aktualisiert wird, wird das SelectedItem auf null gesetzt, nachdem ich es auf das richtige Element festgelegt habe, und setzt daher Invoice.Customer auf null. Ich habe meiner Ansicht schnell einen Button hinzugefügt, um die Kunden zu aktualisieren, ohne den BackgroundWorker zu verwenden. Dies scheint jedes Mal zu funktionieren. Ich möchte die Daten regelmäßig aktualisieren, aber ich muss das herausfinden, bevor ich das kann.
Ich habe meine ItemsSource aktualisiert und mein SelectedItem bleibt dort, wo es sein sollte. Kann das Problem nicht reproduzieren. Zeigt die Definition der Invoice.Customer -Eigenschaft an. – AnjumSKhan