Laden...

EntityFramework: ObservableCollection einer Klasse

Erstellt von m.grauber vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.610 Views
Thema geschlossen
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 12 Jahren
EntityFramework: ObservableCollection einer Klasse

Hallo Profis,

bitte nicht gleich zerfetzen X(. Ich stehe mal wieder total auf dem Schlauch und habe eine wirkliche dumme Anfängerfrage.

"Kunden" ist eine im Programm existierende Entität.

In einer Klasse mache ich folgendes:


public Kunden k1 = new Kunden();

Das klappt. Nun soll in der nächsten Zeile der Klasse eine ObservableCollection davon erstellt werden:


public ObservableCollection<k1> Col1 = new ObservableCollection<k1>();

Das klappt nicht. Was mache ich hier falsch? 🤔 Bei einer selbst erstellten Klasse kann ich doch auch problemlos eine ObservableCollection davon erstellen! Und von der Entität "Kunden" kann ich auch eine ObservableCollection erstellen.

Eine Klasse selbst zu erstellen ist in diesem Fall nicht möglich, da ich dann beim Speichern kein SaveChanges() aufrufen kann.

Eine ObservableCollection von "Kunden" will ich auch nicht erstellen, da k1.PropertyChange später abonniert werden soll - und das soll sich nicht generell auf die Entität "Kunden" auswirken.

Bin für jede Hilfe dankbar!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo m.grauber,

Das klappt nicht.

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5.

Wenn du EF4.1 verwendest dann schau dir mal Using DbContext in EF 4.1 Part 7: Local Data an - da gehts um ObservableCollections.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

849 Beiträge seit 2006
vor 12 Jahren

Es müsste wohl eher heissen:


ObservableCollection<Kunden> Col1 = new ObservableCollection<Kunden>(){k1};
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 12 Jahren

Hallo Gü,

danke für die schnelle Antwort!

Zu Punkt 5: ich konnte keine Fehlermeldung schreiben, da Intellisense sich schon weigerte, die Klasse in die ObservableCollection zu schreiben. Deshalb habe ich keine angegeben und den Code wie gedacht direkt im Browser eingetippt. Zukünftig achte ich bei Fehlern besonders darauf.

Habe leider noch nicht das neuste EF (u. a. wegen vorhandener Installationen und weil ich mit der dt. Version vom VS arbeite. Das Languagepack ist noch nicht fertig)

Über die Neuerungen komme ich aber leider trotzdem nicht zum Ergebnis. X(

Wie kann ich es trotzdem anders schaffen? ** Dann arbeite ich eben mit einer ObservableCollection direkt von der Entität. ** CollectionChanged kann ich abonnieren, es feuert aber leider nicht direkt beim Ändern eines Feldes (z. B. tippen), sondern leider nur beim Hinzufügen von neuen Items.

**
Wie kann ich trotzdem das PropertyChanged der Entität in der ObservableCollection abonnieren? (Nicht das PropertyChanged der Original-Entität)**

Oder kann ich notfalls irgendwie direkt etwas am Binding abfangen? Dort steht im Datagrid (Kundenname ist das Feld mit dem Kundennamen, das bei einer Änderung über PropertyChanged meinen eigenen Code auslösen soll):


... Binding="{Binding Path=Kundenname, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

Vielen Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo m.grauber,

Das Languagepack ist noch nicht fertig

Siehe ADO.NET Entity Framework 4.1 [und Language Packs]

es feuert aber leider nicht direkt beim Ändern eines Feldes (z. B. tippen), sondern leider nur beim Hinzufügen von neuen Items.

Die ObservableCollection hat halt nur Ereignisse wenn sich was an der Collection und nicht an den Items in der Collection ändert. Siehe :rtfm:
Wenn sich was beim Tippen ändern soll ist das ein Fall von INotifyPropertyChanged und hat nix mit der ObsersvableCollection zu tun. Also muss die Entität INotifyPropertyChanged implementieren.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 12 Jahren

Hallo Gü,

INotifyPropertyChanged ist bereits bei der Entität implementiert. Jedoch will ich nicht das direkte PropertyChanged der Entität ("Kunden"), sondern das PropertyChanged meiner lokalen Klasse ("k1") abonnieren.

Daher versuchte ich


public Kunden k1 = new Kunden(); 

was ja zwar geht, von dem ich dann aber leider scheinbar keine ObservableCollection erzeugen kann.

Wenn ich eine ObservableCollection direkt von der Entität erstelle, kann ich andererseits aber wieder nicht das PropertyChanged abonnieren. X(

Seltsamerweise hat der Tip von unconnected wirklich funktioniert; leider kann dort zwar das PropertyChanged nun korrekt abonniert werden, löst aber trotzdem nicht aus? X(

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo m.grauber,

ist die lokale Klasse auch INotifyPropertyChanged? Sonst gehts natürlich nciht.
Was ist bei dir überhaupt der Unterschied zwischen Entität und lokaler Klasse?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 12 Jahren

Hallo unconnected,

vielen Dank für diesen Tipp!


ObservableCollection<Kunden> Col1 = new ObservableCollection<Kunden>(){k1}; 

Das funktioniert bei mir aber nur, wenn k1 "static" ist.

Nun kann ich daher PropertyChanged von k1 abonnieren. Leider feuert es aber nicht (trotz INotifyPropertyChanged + PropertyChangedEventHandler + InvokePropertyChanged in der Entitätsklasse "Kunden"). (Liegt dies am static?)

Vielen Dank!

Hallo Gü,

die lokale Klasse k1 habe ich aus der Entität erstellt:


public static Kunden k1 = new Kunden();

daher sollte sie auch das in Kunden implementierte INotifyPropertyChanged ebenfalls implementieren.?. Zumindest kann ich es ja an dieser Stelle nicht nochmals zusätzlich angeben.

Die Entität Kunden ist mein "direkter Link" in die Datenbank.

Die lokale Klasse k1 muss ich nur erstellen, damit ich k1.PropertyChange abonnieren kann. Beim Ändern z. B. des Kundennamens soll dieses gefeuert werden.

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo m.grauber,

die lokale Klasse k1 habe ich aus der Entität erstellt:

Hast du nicht. Du hast eine Instanz der Klasse - also ein Objekt - einem statischen Feld zugewiesen. Nicht mehr oder weniger.

daher sollte sie auch das in Kunden implementierte INotifyPropertyChanged ebenfalls implementieren.?

Das Feld implementiert gar nix. Es verweist auf die Instanz der Klasse und diese Klasse implementiert INotifyPropertyChanged.

Die lokale Klasse k1 muss ich nur erstellen, damit ich k1.PropertyChange abonnieren kann. Beim Ändern z. B. des Kundennamens soll dieses gefeuert werden.

Vergiss die lokale Klasse. Das gibt es nicht - zumindest nicht hier.
Wenn ein Eventhandler registriert und INotifyPropertyChanged korrekt implementiert ist dann wird das Event auch gefeuert. Siehe [FAQ] Eigenen Event definieren / Information zu Events

Mir scheint wir sind bei [Hinweis] Wie poste ich richtig? Punkt 1.1.1 angelangt.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Thema geschlossen