Mit BindingOperations.EnableCollectionSynchronization
Habe ich zwei WPF-Anwendungen "UI", "Debugger" und eine ClassLibrary "BL". UI Verweise auf Debugger und BL. Debugger verweist auf BL.
Ich habe die Sammlung in BL genannt MyCollection. UI-app startet den Debugger app und Debugger bindet an eine collection MyCollection in BL. Wenn ich versuche die MyCollection Sammlung von UI-app bin ich immer die Ausnahme.
A first chance exception of type 'System.NotSupportedException' occurred in PresentationFramework.dll
Additional information: This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.
War ich googeln um und fand dieses: BindingOperations.EnableCollectionSynchronization
Ich kann nicht herausfinden, wie es zu benutzen. Ich will nicht an Bezugnahme auf andere UI-dlls von meinem BL-Projekt. Kann jemand mir helfen?
Danke für die Hilfe!
InformationsquelleAutor Dilshod | 2014-02-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Allen Beispielen, die ich gesehen habe, auf Stack Overflow für dieses bekommen es falsch. Sie muss sperren der Auflistung ändern, wenn es aus einem anderen thread.
Auf dem dispatcher (UI) - thread:
Dann aus einem anderen thread:
Mehr Informationen in diesem Artikel: http://10rem.net/blog/2012/01/20/wpf-45-cross-thread-collection-synchronization-redux
InformationsquelleAutor Drew Noakes
Ich bin nicht sicher, ob dies helfen wird, aber trotzdem kann man es versuchen.
Hinzufügen
Property
imDebugger
was hält dieCollection
ausBL
wieIm Konstruktor fügen Sie einfach die folgende Zeile
dieser wird über der Zeile kümmern wird thread-Sicherheit.
Unten ist das Beispiel
ViewModel (
Debugger
)Modell(
BL
)MainWindow.xaml.cs
MainWindow.xaml
Wenn das Fenster geladen wird, geben Sie einfach "SomeValue" in der
ComboBox
und dann nach drücken derTab
Schlüssel, sollten Sie den neuen Wert in dieComboBox
dropdown -Die
INotifyPropertyChanged
- Schnittstelle wird verwendet, um Benachrichtigen von der Benutzeroberfläche für beliebiger änderung der Daten im ViewModel. Ansonsten ist dieUI
nie bekommen neue Werte.ObservableCollection<T> übernimmt das für Sie. So brauchen Sie nicht, um es für ObservableCollections.
"BindingOperations.EnableCollectionSynchronization(_data, _lock);" kümmert sich nicht wirklich um thread-Sicherheit. Sie haben noch um es zu sperren _lock Objekt.
Sie tun haben, um die Sperre auf das lock-Objekt, wenn eine änderung der Auflistung aus einem anderen thread (haben Sie nicht nur zum Versand an den UI-thread zu tun). Lesen Sie diesen Artikel für weitere Infos: 10rem.net/blog/2012/01/20/...
InformationsquelleAutor Sandesh
In diesem blog finden Sie eine einfache Anleitung, wie man mit BindingOperations...es ist ganz einfach.
InformationsquelleAutor Marco
Konnte ich nicht herausfinden, wie es zu benutzen, entweder, wenn ich hatte das gleiche problem.
Ich endete mit meiner eigenen Sammlung geben, wo Lagere ich die dispatcher und verwenden Sie es, wenn nötig.
Beachten Sie, dass meine Namensgebung war sehr schlecht, diese Sammlung ist nicht threadsicher, weit von es.
BindingOperations.EnableCollectionSynchronization
).InformationsquelleAutor Herm