2009-04-23 5 views
3

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

10

Obwohl ein ObservableCollection ist der beste Weg, die eigentliche Frage zu beantworten, die Art und Weise manuell zu aktualisieren ist BindingExpression.UpdateTarget

+0

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

4

Sie sollten stattdessen eine ObservableCollection verwenden, dann erhalten Sie automatisch Updates.

+0

Kann ich eine ObservableCollection in einer Nicht-WPF-Assembly verwenden? – harriyott

+0

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

+0

Es ist in WindowsBase, und ich stimme zu. Es gibt normalerweise keinen Grund, etwas anderes als ICollection oder IList zu enthüllen, so dass Sie die Implementierung später immer austauschen können. –

2

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.

Verwandte Themen