Unerwartetes Verhalten von DataGrid

8

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 ????

    
Vishal 28.11.2014, 13:26
quelle

2 Antworten

3

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: Ссылка

    
Vishal 02.12.2014, 07:19
quelle
3

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

zu setzen

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.

    
toadflakz 28.11.2014 15:27
quelle

Tags und Links