Ich habe eine Liste <Foo> von einer Nicht-WPF-Assembly, die ich versuche, an eine WPF <ListBox> Database zu binden. Anfangs werden die Listenelemente ordnungsgemäß angezeigt, aber wenn ich der Liste <Foo> ein neues Element hinzufüge, fügt das Listenfeld kein Listenelement hinzu. Wie kann ich dem Listenfeld mitteilen, die Daten erneut zu binden/zu aktualisieren/zu aktualisieren und den neuen Artikel anzuzeigen?WPF-Datenbindungs-Handbuch Update
Antwort
Obwohl ein ObservableCollection ist der beste Weg, die eigentliche Frage zu beantworten, die Art und Weise manuell zu aktualisieren ist BindingExpression.UpdateTarget
Sie sollten stattdessen eine ObservableCollection verwenden, dann erhalten Sie automatisch Updates.
Kann ich eine ObservableCollection in einer Nicht-WPF-Assembly verwenden? – harriyott
Ja, wenn Sie PresentationBase einschließen (ich denke, die Klasse ist in System.Collections.ObjectModel, aber das Impl ist in PresetationBase); oder wenn Sie die gleiche Funktionalität erhalten möchten, erstellen Sie Ihre eigene ObservableCollection, indem Sie INotifyCollectionChanged implementieren. – Scott
Es ist in WindowsBase, und ich stimme zu. Es gibt normalerweise keinen Grund, etwas anderes als ICollection
Vielen Dank für diese Posting Antwort zu nennen. Auch wenn Sie ObservableCollection verwenden, müssen Sie möglicherweise BindingExpression.UpdateTarget verwenden. Dies kann der Fall sein, wenn sich die Sammlung nicht im UI-Thread befindet. Ich habe einige Multithread-WPF-Apps geschrieben, und ich merke, dass ich die Datenbindung entfernen muss, wenn ich Modellcode in einen anderen Thread verschiebe, weil ich nicht mit dem Update-System rechnen kann, um wirklich zu funktionieren. Während ich die Datenbindung für ein großartiges Konzept halte, glaube ich, dass die Undurchsichtigkeit des Datenbindungssystems ein echtes Hindernis für meine Übernahme war. (Sorry für die Tirade!) Danke nochmal, Adam.
Haben Sie das im Szenario der Frage versucht? Der Grund, den ich stelle, ist, dass ich den Eindruck hatte, dass UpdateTarget die Liste nicht aktualisiert, wenn die Sammlung dieselbe Referenz ist (wenn Sie eine neue Sammlung erstellen, würde dies eine Neubindung erzwingen, oder wenn Sie zuerst die Quelle auf Null setzen). – Scott