2009-08-18 3 views
0

Ich brauche bitte Beratung und Klärung. Ich arbeite gerade an einer Monitor-App, die den Inhalt einer Datenbank in einem Datagrid anzeigen muss (ich verwende das WPFToolkit Grid BTW). Das Raster bindet an eine Tabelle in meinem ADO.NET DataSet und es funktioniert einwandfrei. Wenn ich das DataSet über eine Schaltfläche in meiner Benutzeroberfläche ändere, wird das Grid aktualisiert und alle sind zufrieden (die Bindung und ADO.NET sind in this blog beschrieben). Die Datenbank wird jedoch von anderen Anwendungen aktualisiert, und die Monitor-App muss diese Änderungen automatisch anzeigen. Das DataSet wird durch Abfragen der Datenbank aktualisiert (aus verschiedenen Gründen ist das Abhören von post_events aus der Datenbank nicht möglich), aber die Änderungen werden nicht im Raster angezeigt.WPF und Datenbindung in einer ADO.NET App mit mehreren Threads

Soweit ich verstanden habe, ist dies eine Funktion von WPF Databinding. Sie können die Quelle nicht von einem anderen Thread als der Benutzeroberfläche aktualisieren. In meinen Gedanken ist das verrückt. Es müssen Tausende von Apps vorhanden sein, in denen Daten von einem anderen Benutzer oder einer anderen Anwendung eingegeben werden. Ich habe versucht, den Dispatcher zu verwenden, um die tatsächliche Aktualisierung der Quelle in den UI-Thread zu verschieben, aber ich erhalte immer noch denselben Fehler.

Also jetzt zu meiner Frage: Ist meine Analyse korrekt und wenn ja, können Sie einen Rat geben, wie Sie das Problem lösen können? Auch wenn meine Analyse korrekt ist, kann jemand bitte versuchen zu erklären, warum WPF so funktioniert?

Vielen Dank für Ihre Zeit

Antwort

0

Nach noch mehr Forschung zu tun Ich habe meine Analyse korrekt befunden. Obwohl ich keine Möglichkeit gefunden habe, es in ADO.NET funktionieren zu lassen, habe ich eine gute Lösung gefunden here, die ein einfaches Derivat von ObservableCollection verwendet.

Mit dem RowChanged-Ereignis aus der DataTable verfolgen ich eine BindableCollection-Ansicht der Tabelle und verwenden Sie diese als mein DataContext. Klappt wunderbar.