Das bekannte Programm zur optimalen Vorbereitung auf die theoretische Führerscheinprüfung
VB.Net-Forum - Beitragsübersicht -
ThemaV12: ObservableCollection, nur bedingte Benachrichtigung.
Von Jeiss
Datum 23. Mai 2016 um 22:08:04
Frage Hallo,
meine Frage betrifft das arbeiten mit der ObservableCollection(Of T)-Klasse.
Bei MSDN liest man diesbezüglich so schön: Stellt eine dynamische Datenauflistung dar, die Benachrichtigungen bereitstellt, wenn Elemente hinzugefügt oder entfernt werden oder wenn die gesamte Liste aktualisiert wird.
Das klang so vielversprechend, dass ich mir ein WPF Projekt angelegt habe um zu sehen ob sogar ich mittels dieser Klasse, mit meinen bescheidenen Kenntnissen, ein schönes Projekt erschaffen könnte.
Ich musste aber leider sehr schnell feststellen, dass das doch ein gewisses Mass an Fachkenntnissen verlangt.
Und jetzt bin ich an dem Punkt angelangt wo ich trotz Google, MSDN un co nur noch im Kreis rumdrehe. Und jetzt hoffe ich natürlich, dass jemand so nett und hilfsbereit ist um mir weiter zu helfen.

Ich versuche mal so gut ich kann mein Projekt mit meinen eigenen Worten zu beschreiben.
Es handelt sich um ein WPF Projekt mit Visual Studio 2015. Die Daten welche die Desktopanwendung bearbeiten soll stammen aus einer SQL Datenbank mit gleich 2 Tabellen die in einer "1 to n parent/child" Relation verbunden sind.
Diese Daten werden im Projekt als Entity Model bereitgestellt. Oder müsste ich doch besser sagen, dass das Model aus der .MDF Datei erstellt wurde und zum Projekt gehört.
Die Datensätze sollen dann schlussendlich in einem ListView dargestellt werden. Und der Gedanke war eigentlich der, dass beim löschen oder hinzufügen eines "Datensatzes" das Element im UI das gleich mit bekommen sollte und dann auch gleich anzeigen sollte.
Dank der in der ObservableCollection-Klasse bereitgestellten INotifyCollectionChanged und INotifyPropertyChanged Schnittstellen hatte ich mir viel weniger Schwierigkeiten erwartet.
Und jetzt habe ich natürlich viele Fragen an euch. Erstens, kann mit der oben beschriebenen "Konstellation" in meinem Projekt mittels der ObservableCollection(Of T)-Klasse erreicht werden, dass ohne viel Programmierung-Aufwand, eine funktionierende Anwendung entstehen kann?
Oder gilt das nur unter bestimmten Bedingungen? (vielleicht nicht bei Verwendung eines Entity Models?)
Oder liegt es einfach nur an Fehlern in meinem Projekt, dass das mit der "Benachrichtigung" nicht so gut klappt?
Da ich ja hoffe, dass jemand mir seine Hilfe anbieten wird, übe ich besser gleich mal wie man Code posten kann.
Hier mal zum Test ein (bestimmt für ein besseres Verständnis meines Problems nützlicher) Ausschnitt aus der xaml Datei aus dem "MainWindow".
    <Window.Resources>
<CollectionViewSource x:Key="TodosView"/>
<!--<CollectionViewSource x:Key="StagesView" Source="{Binding Source={StaticResource TodosView}, Path='Stages'}" />-->
<CollectionViewSource x:Key="StagesView" Source="{Binding Stages, Source={StaticResource TodosView}}" />
</Window.Resources>
Besten Dank im Voraus,
Jeiss
Antwort:
Von Nico
E-Mail nico.schertler@studentpartners.de
Datum 27. Mai 2016 um 08:27:13
Antwort Wie gesagt. Das Problem ist nicht der Weg von der ObservableCollection zum ListView, sondern von der Datenbank (Entity Model) zur ObservableCollection. Mit der folgenden Zeile
TodosdData = New ObservableCollection(Of Todo)(TodosEntities.Todos)
legst du eine neue ObservableCollection an und kopierst die Einträge aus TodosEntities.Todos.
Die Verwendung der CollectionViewSource ist übrigens auch (in der derzeitigen Form) überflüssig. Du kannst direkt an TodosdData binden.
Ich habe gerade nicht im Kopf, welche Klassen die so erzeugten Entity-Models verwenden. Sind das DbSet(Of T)? In dem Fall, wird das ganze noch viel einfacher. Ein DbSet(Of T) repräsentiert die Verbindung zu einer Datenbanktabelle. Dabei können einige Einträge schon lokal im Hauptspeicher vorhanden sein (z.B. wenn diese schon abgefragt wurden). Diese Einträge sind in .Local enthalten. Glücklicherweise ist .Local bereits eine ObservableCollection(Of T). Du kannst dein ListView dann also direkt an TodosEntities.Todos.Local binden und hast alles fertig. Natürlich vorausgesetzt, dass das die richtigen Klassen sind. Eventuell ist es sinnvoll, auf das EntityFramework umzusteigen, das das auf jeden Fall so macht.

Nico
[ Antwort schreiben | Zurück zum VB.Net-Forum | Forum-Hilfe ]
Antworten
V12: ObservableCollection, nur bedingte Benachrichtigung. - Jeiss 23. Mai 2016 um 22:08:04
Re: ObservableCollection, nur bedingte Benachrichtigung. - Nico 26. Mai 2016 um 13:57:03
Re: ObservableCollection, nur bedingte Benachrichtigung. - Jeiss 26. Mai 2016 um 23:37:50
Re: ObservableCollection, nur bedingte Benachrichtigung. - Nico 27. Mai 2016 um 08:27:13
Re: ObservableCollection, nur bedingte Benachrichtigung. - Jeiss 28. Mai 2016 um 12:36:55
Re: ObservableCollection, nur bedingte Benachrichtigung. - Nico 29. Mai 2016 um 14:41:52

Ihre Antwort
(Nick-)Name   Wichtige Informationen zur Namensangabe
E-Mail (opt.)  Wichtige Informationen zur Angabe einer eMail-Adresse
Thema   Wichtige Informationen zur Angabe eines Themas
Betrifft (IDE)  VB 2012
Ihre Antwort
Smilies
Mehr...
FettKursivUnterstrichen   Übersicht der Tipp-KürzelÜbersicht der Projekt-KürzelÜbersicht der Bücher-Kürzel 
Homepage
Titel
Root-Smilies              
             
             
[ Zurück zum VB.Net-Forum | Forum-Archiv | Forum-Hilfe | Chat ]

Zum Seitenanfang

Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB.Net | VB/VBA-Forum | DirectX | DirectX-Forum | Chat | Ausschreibungen | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Sonntag, 13. Dezember 2015