Benutzer mit den meisten Antworten
ObservableCollection, update gesamter Liste

Frage
-
Hallo Leute,mein Problem besteht darin, dass sich das an eine ObservableCollection gebundene DataGrid automatisch updated, sobald ich Item hinzufüge, jedoch erfolgt kein Update, wenn ich die komplette Liste änder.MeinUpdate der gesamten Liste schaut wie folgt aus.
MeineDatenList = e.Result.MeineDatanList;
Die im DataGrid angezeigte Liste wird komplett durch eine andere überschrieben, also "die gesamte Liste aktualisiert".
Oder nicht?
Vielen Dank
Die OnCollectionChanged-Methode ist auch nicht verfügbar?!Nur Warum?Achso, das ganze erfolgt mit Silverlight!Dienstag, 31. August 2010 10:48
Antworten
-
Hallo Le.,
> jedoch erfolgt kein Update, wenn ich die komplette Liste ändere.
normal geht das über die Implementation der:
[INotifyCollectionChanged-Schnittstelle (System.Collections.Specialized)]
Wenn Deine Auflistung eine ObservableCollection<T> ist, verfügt sie bereits automatisch über das:
[ObservableCollection<T>.CollectionChanged-Ereignis (System.Collections.ObjectModel)]Zitat aus [Databinding in Silverlight]:
- "When Silverlight establishes a data binding it will look to see if the model collection implements the INotifyCollectionChanged interface and if so will automatically subscribe to the event. This means you don’t have any additional work to do when binding to an observable collection. If we bind an observable collection to the ItemsSource property of a ListBox, for example, then the ListBox will automatically display new objects we add to the collection, and will automatically remove objects we delete from the collection."
Das Problem ist, wenn Du die Eigenschaft einfach auf eine neue (gleich strukturierte) Liste setzt, dass die Original-Liste ja gleichbleibt! Infolgedessen wird auch kein CollectionChanged geworfen.
Versuche einmal folgendes:
personDataGrid.ClearValue(DataGrid.ItemsSourceProperty);
personDataGrid.ItemsSource = e.Result.MeineDatenList;
ciao Frank- Als Antwort markiert le.wugel Montag, 6. September 2010 10:25
Mittwoch, 1. September 2010 19:28
Alle Antworten
-
,mein Problem besteht darin, dass sich das an eine ObservableCollection gebundene DataGrid automatisch updated, sobald ich Item hinzufüge, jedoch erfolgt kein Update, wenn ich die komplette Liste änder.Wie meinst Du das? �?nderst Du den gesamten Inhalt der gesamten Liste oder erzeugst du eine neue Instanz einer Liste?Für den ersten Fall reicht ein Notify an die Oberfläche, damit diese ein Refresh ausführt. Im zweiten Fall musst Du neu binden.
--
Viele Gruesse
PeterDienstag, 31. August 2010 11:29 -
Hi Peter,
danke für deine schnelle Antwort.
"MeineDatenList" ist meine an das DataGrid gebundene ObservableCollection.
Wenn ich ihr eine Datensatz adde, MeineDatenList.Add(datensatz), bekommt das DataGrid das refresh.
Wenn ich jedoch die komplette Liste änder, MeineDatenList = e.Result.MeineDatenList, dann bekommt das DataGrid kein refresh.
e.Result.MeineDatenList hat den selben aufbau wie "MeineDatenList", jedoch komplett andere Werte.
Das Notify an die Oberfläche sollte doch eigentlich auch automatisch erfolgen, da ja ein DataGrid an eine ObservableList gebunden ist.
Oder?
Vielen Dank
Dienstag, 31. August 2010 11:50 -
"MeineDatenList" ist meine an das DataGrid gebundene ObservableCollection.
In MeineDatenList steht ein Verweis auf ein Objekt vom Typ ObservableCollection. Dieser Verweis wird zum Zeitpunkt der Bindung dem Grid übergeben. Alles, was in diesem ObservableCollection-Objekt gemacht wird, ist auch im Grid sichtbar.
Wenn ich ihr eine Datensatz adde, MeineDatenList.Add(datensatz), bekommt das DataGrid das refresh.
Wenn ich jedoch die komplette Liste änder, MeineDatenList = e.Result.MeineDatenList, dann bekommt das DataGrid kein refresh.
Von e.Result.MeineDatenList bekommst Du einen Verweis auf ein anderes ObservableCollection-Objekt, z.B. vom Proxy eines WebServices. Diesen Verweis trägst Du in die Variable "MeineDatenList" ein. Das Grid bekommt davon nichts mit. Im Grid steht noch der Verweis auf das alte ObservableCollection-Objekt.
e.Result.MeineDatenList hat den selben aufbau wie "MeineDatenList", jedoch komplett andere Werte.
Nicht nur das. Es ist auch ein anderes Objekt. Mit Equals ist das leicht zu prüfen.
Das Notify an die Oberfläche sollte doch eigentlich auch automatisch erfolgen, da ja ein DataGrid an eine ObservableList gebunden ist.
Oder?
Die neuen Daten liegen in einem anderen Objekt, von dem das Grid nichts wei�?, solange dieses neue Objekt nicht gebunden wird.
Für die Lösung gibt es die folgenden Möglichkeiten:
- neu binden oder
- altes ObservableCollection-Objekt leeren (Clear) und Elemente-Verweise aus der neuem ObservableCollection-Objekt kopieren oder
- Nutzung eines zwischengeschalteten Objektes, an das dann die neue ObservableCollection-Objekt gebunden wird. Als zwischengeschaltetes Objekt kann beispielsweise eine CollectionViewSource dienen. Das hat den Vorteil, dass auch noch gefiltert und sortiert werden kann.
--
Viele Gruesse
PeterDienstag, 31. August 2010 12:20 -
Hallo Le.,
> jedoch erfolgt kein Update, wenn ich die komplette Liste ändere.
normal geht das über die Implementation der:
[INotifyCollectionChanged-Schnittstelle (System.Collections.Specialized)]
Wenn Deine Auflistung eine ObservableCollection<T> ist, verfügt sie bereits automatisch über das:
[ObservableCollection<T>.CollectionChanged-Ereignis (System.Collections.ObjectModel)]Zitat aus [Databinding in Silverlight]:
- "When Silverlight establishes a data binding it will look to see if the model collection implements the INotifyCollectionChanged interface and if so will automatically subscribe to the event. This means you don’t have any additional work to do when binding to an observable collection. If we bind an observable collection to the ItemsSource property of a ListBox, for example, then the ListBox will automatically display new objects we add to the collection, and will automatically remove objects we delete from the collection."
Das Problem ist, wenn Du die Eigenschaft einfach auf eine neue (gleich strukturierte) Liste setzt, dass die Original-Liste ja gleichbleibt! Infolgedessen wird auch kein CollectionChanged geworfen.
Versuche einmal folgendes:
personDataGrid.ClearValue(DataGrid.ItemsSourceProperty);
personDataGrid.ItemsSource = e.Result.MeineDatenList;
ciao Frank- Als Antwort markiert le.wugel Montag, 6. September 2010 10:25
Mittwoch, 1. September 2010 19:28