Ich habe ein sehr kompliziertes Problem. Ich habe versucht, alles zu überprüfen, und ich habe fast 6 Stunden für dieses Problem gearbeitet. Aber ich bin nicht erfolgreich, dieses Problem zu lösen. Also, hier ist die Frage.
Problem:
Zu Beginn des Programms:
Wenn ich in einer Zeile auf Bearbeiten klicke:
Wenn ich diese Zeile speichere:
Wenn ich auf die Schaltfläche "Bearbeiten" in einer anderen Zeile mit einer anderen übergeordneten Gruppe klicke:
XAML sieht wie folgt aus:
%Vor%Hier ist der Code-Behind:
%Vor%Zum Schluss ist hier der Code für ViewModel:
%Vor%Ich bin nicht sicher, wo das Problem liegt, also habe ich fast den ganzen Code hier gepostet.
Ich habe ein Beispielprojekt erstellt, das über den folgenden Link heruntergeladen werden kann:
Projekt:
Datenbank:
Bearbeiten 1:
Das ursprüngliche Problem (wie in den Bildern gezeigt) ist gelöst
Um das Problem zu lösen, habe ich CollectionViewSource entfernt und die ComboBox direkt an die ViewModel-Eigenschaft gebunden. Jetzt bekomme ich einen weiteren Fehler:
Wenn ich InnerException sehe:
Ich habe das Netz nach diesem Fehler gesucht, aber dann kann ich überall sehen, dass wenn ich NULL-Wert in die fremde Schlüsselspalte einfüge, dann bekomme ich diesen Fehler. Aber meine Spalte ist Nullable und ich brauche Nullen eingefügt werden.
2 bearbeiten:
Ich habe den in Edit 1 erwähnten Fehler behoben.
Ein neuer Datensatz wurde als erster Datensatz in der Tabelle Primary hinzugefügt. Und alle Codierungen entfernt, die zur primären Gruppe gehören. NULL in der Datenbank durch die primäre Gruppe ersetzt.
Nun besteht das einzige Problem darin, eine CollectionViewSource als Quelle der Combobox zu verwenden, um die Daten zu sortieren, anstatt die Combobox direkt mit der Eigenschaft in ViewModel zu verbinden. Kann jemand diese Frage beantworten ????
Das Problem ist gelöst. Bitte beachte Edit 1 und Edit 2 in Frage für die Hälfte der Lösung.
Nach Bearbeitung 2 konnte ich die Daten in ComboBox mit CollectionViewSource nicht sortieren. Also habe ich OrderBy in meiner Abfrage verwendet. Jetzt sind die Daten in ComboBox wie erwartet sortiert. Jetzt sieht meine Abfrage so aus:
%Vor%Jetzt funktioniert das DataGrid wie erwartet.
Ich habe diese Lösung gepostet, weil ich denke, dass es jemandem in Zukunft helfen könnte.
Danke an alle, die sich für die Lösung meines Problems interessiert haben.
Hier finden Sie das funktionierende Beispiel:
Projekt: Ссылка
Datenbank: Ссылка
Sie mischen Commands
und Event-Handler - nie eine gute Idee. Ich glaube, ich verstehe, was Sie versuchen zu tun. Dies ist die reine MVVM-Lösung ohne Event-Handler-Route.
Bevor wir beginnen, wird davon ausgegangen, dass Ihr DataGrid
an ein ObservableCollection
von ViewModel
-Objekten gebunden ist, die die einzelnen Zeilen darstellen. Dies löst einen großen Teil des Aufwands und der Komplexität mit RelativeSource
bindings to parent ViewModel
objects, wie Sie derzeit in Ihrem XAML haben, und vereinfacht die Implementierung pro Zeile Commands
(weil die Daten und der Befehl innerhalb derselben Klasse gekapselt sind) Wenn Sie DelegateCommand
verwenden - da Sie PRISM verwenden, gehe ich davon aus, dass Sie es überall verwenden.
Zuerst sollten Sie einen Stil für die DataGridCell.IsEditing
Eigenschaft hinzufügen, um ihn an eine IsEditing
boolean Eigenschaft für Ihre ViewModel
zu binden. Ändern Sie Ihre Bearbeitungsschaltfläche, um an eine Command
zu binden, die IsEditing
in Ihrer Zeile ViewModel
auf true
festlegt - das Raster sollte reagieren, indem Sie in den Bearbeitungsmodus wechseln.
Sie sollten in Betracht ziehen, Ihre Bearbeitungsvorlagen an bestimmte Werte zu binden, damit Sie Ihre ursprünglichen Daten nicht überschreiben, wenn Sie Bearbeiten abbrechen. Denken Sie auch daran, die Bindung auf Mode=TwoWay
mit UpdateSourceTrigger=PropertyChanged
Sie können den Mappern für Interaktionsereignisse zu den verschiedenen Edit-Vorlagensteuerelementen so hinzufügen, dass beim Aufruf von Enter der SaveCommand
aufgerufen und der Editiermodus beendet wird, indem IsEditing
auf Ihrem ViewModel auf false gesetzt wird.