Ich habe das erforscht und bin ratlos: Ich habe ein WPF DataGrid und verwende ein MVVM-Modell. Ich möchte unter bestimmten Umständen verhindern, dass eine Zeile im DataGrid geändert werden kann. Ich habe das erforscht und Techniken wie die hier hier
In der Praxis funktioniert das, aber es gibt ein unerwünschtes "Flackern" (es wählt die angeklickte Zeile für einen Moment aus und kehrt dann zur vorherigen Auswahl zurück), während dies eine enge Lösung ist. Ich wünschte, es gäbe einen eleganteren Weg als verhindere die Zeilenänderung überhaupt an erster Stelle.
Ich bin überrascht, dass es kein SelectionChanging oder BeforeSelectionChanged gibt, damit ich das Ereignis vom Feuern abbrechen könnte; und die erzwungene Verhinderung der Indexänderung in meinem View-Modell scheint keinen Unterschied zu machen.
Wie kann ich das tun?
Danke.
Was passiert, wenn Sie die Ereignisse previewkeydown
und previewmousedown
ausführen und einfach e.Handled=true
unter bestimmten Umständen aufrufen?
Bearbeiten:
um den mvvm-stil zu erfüllen:
Sie können ein Behavior
mit einem DependencyProperty
erstellen, an das Sie Ihre Situation binden können.
In diesem Verhalten können Sie die Ereignisse und vielleicht einige andere Dinge behandeln, wie der Benutzer auf einen Datarow oder Header klickt ...
DispatcherPriority wurde auf ContextIdle gesetzt. Dies führt zu Flackern, da Ihr SelectedItem zweimal eingestellt ist (und zweimal gerendert wurde). Setzen Sie die Priorität auf Normal und Sie werden nicht mehr flackern.
Es gibt einige Beispiele für die PreviewMouseDown-Methode hier .
Laut allgemeiner Vereinbarung funktioniert das Zurücksetzen von DataGrid.SelectedItem auf den ursprünglichen Wert innerhalb des SelectionChanged-Handlers des Datagrids nicht wie erwartet; Alle Codebeispiele, die scheinbar funktionieren, verschieben die Umkehrung, indem sie den Dispatcher bitten, sie später zu planen.
Haben Sie einen CellStyle auf Ihrem Datagrid? Für mich funktionierte folgendes:
xaml:
%Vor%Codebehind:
%Vor%Der Punkt war, dass das SelectedCellsChanged-Ereignis nach dem SelectionChanged-Ereignis ausgelöst wurde - und insbesondere, dass SelectedItem nicht korrekt die SelectedCells aktualisiert, die eine schreibgeschützte Eigenschaft sind, also mehr codebehind:
%Vor%Offensichtlich müssen die Handler an die entsprechenden Ereignisse im Datenraster angeschlossen werden.
Dies funktionierte wie erwartet, löschte die Auswahländerung, falls gewünscht, und erzeugte kein Flimmern.
Tags und Links wpf c# datagrid selectionchanged