verhindert Zeilenwechsel im Datagrid

8

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.

    
Mani5556 26.07.2011, 03:23
quelle

3 Antworten

5

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

    
blindmeis 26.07.2011, 05:45
quelle
2

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.

    
Nihad Rizvanovic 11.01.2012 09:55
quelle
0

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.

    
J S 24.09.2013 04:55
quelle

Tags und Links