WPF-Datagrid mit MVVM

8

Ich versuche, ein Datagrid in WPF an mein ViewModel zu binden, damit es alle Zellenänderungen in der Datenbank aktualisiert und dem Benutzer ermöglicht, Zeilen zu löschen und neue Zeilen hinzuzufügen. Ich habe einen Teil davon funktioniert, kann aber keine elegante Lösung für die ADD finden und modifizieren. Hier ist das Xaml

%Vor%

dann aus meiner Sicht Modellmethode

%Vor%

Das Löschen einer Zeile oder das Ändern einer Zeile im Datagrid fließt nicht in die Datenbank.

a) Welche andere Bindung muss ich im XAML-Code erstellen, der diese Ereignisse erkennt?

b) Wie erkenne ich einen entfernten Datensatz oder ein geändertes Objekt im Ansichtsmodell, so dass ich den Datenkontext aktualisieren kann, wenn dies nicht automatisch geschieht.

    
Josef 10.08.2011, 07:41
quelle

4 Antworten

1

Abonnieren Sie einfach das CollectionChanged-Ereignis Ihrer ObservableCollection. Der Ereignishandler empfängt eine Instanz der NotifyCollectionChangedEventArgs Klasse, die eine Eigenschaft enthält 'Aktion' beschreibt, ob Zeilen hinzugefügt oder entfernt wurden. Es enthält auch Listen der Zeilen, die ( ‚NewItems‘) oder entfernt ( ‚OldItems‘) hinzugefügt wurden. Das sollte Ihnen genug Informationen geben, um Ihre Datenbank zu aktualisieren.

Sie können implementieren INotifyPropertyChanged in Ihrer Reihe Ansichtsmodell (Klasse ItemsList Ich denke) und dann abonnieren Sie es, um herauszufinden, ob eine Zeile ist schmutzig und muss in der Datenbank aktualisiert werden. Die Schnittstelle besteht aus einem einzigen Ereignis PropertyChanged , die in den Immobilien-Setter Ihrer Ansichtsmodell, wenn sich ein Wert ändert.

angehoben werden soll,

Sie haben Recht, das NotifyCollectionChanged-Ereignis kommt zu früh für eine sofortige Einfügung in die Datenbank. Aber man kann Fahne der Zeile als ‚eingefügt‘ in den Event-Handler und setzen Sie sich, sobald das letzte Eigenschaft geänderte Ereignis (siehe oben) erforderlich, um die Zeile zu vervollständigen auftritt.

    
andyp 10.08.2011 08:04
quelle
1

Ich sehe ein paar Probleme mit dem Code in Ihrer Frage. Der Grund, warum das Löschen einer Zeile nicht in der Datenbank widergespiegelt wird, ist die .ToList () - im Wesentlichen erstellen Sie eine neue Liste, die eine Kopie von query ist Das Raster entfernt Elemente aus dieser Kopie.

Sie sollten eine ListCollectionView verwenden und statt einer linq-Anweisung einen Filter verwenden.

Hier ist ein Beispiel, wie es gemacht wird:

1) Erstellen Sie ein neues WPF-Projekt namens ListCollectionViewTest

2) In der MainWindow.xaml.cs cut & amp; fügen Sie folgendes ein (sollte in ViewModel sein, aber ich bin zu faul)

%Vor%

3) In MainWindow.xaml cut & amp; einfügen:

%Vor%     
user2068358 13.02.2013 19:25
quelle
0

Ihr Datenkontext existiert zu dem Zeitpunkt nicht, an dem Sie Udpates erstellen würden. Sie verwenden eine using-Anweisung, die den Kontext zerstört. Der einzige Grund dafür, dass Sie Daten sehen, besteht darin, dass Sie eine Abfrage gezwungen haben, die über Ihre DB (über die Anweisung .ToList () ausgeführt wird). Um deine Fragen zu beantworten:

a) nichts mehr wird speziell für die Bindung benötigt b) Durch den Aufruf von SaveChanges () in Ihrem InspectorGeneralEntities () - Kontext werden alle Änderungen in Ihrer Datenbank aktualisiert.

    
justin arsine 26.02.2013 18:33
quelle
0

Sie könnten ein neues ViewModel CLass: ItemGridVM erstellen, um jedes Zeilenobjekt darzustellen, dh ItemGridVM macht die Item-Klasseneigenschaften verfügbar, die Sie in Ihrem Datagrid binden. zB:

%Vor%

Nun können Sie in yourMainViewModel eine Observable-Komponente von ItemGridVM als

erstellen %Vor%

Nun wird im Falle einer Aktion in einer beliebigen Zeile der Befehl an ItemGridVM gebunden. So erhalten Sie die Zeilendetails als exponierte Eigenschaften. Ich habe das gleiche Problem damit gelöst. (Reine MVVM)

    
angad.stjudes 19.04.2013 11:54
quelle

Tags und Links