2009-10-29 3 views
7

Ich habe ein WPF Datagrid, das ich mit einer Anzahl von Spalten verwende. Eine der Spalten hat einige Elemente, die manchmal null sind, und dies verursacht eine Ausnahme, wenn ich versuche, nach dieser Spalte zu sortieren.WPF-Datagrid-Sortierung für Spalte mit Nullelementen

Die Definitionen der Spalten ist so etwas wie:

<dg:DataGrid.Columns> 
    <dg:DataGridTextColumn Binding="{Binding MyObject.Field1}" Header="Field1" Width="Auto" /> 
    <dg:DataGridTextColumn Binding="{Binding MyObject.Field2.SubField}" Header="Field2" Width="Auto" /> 
</dg:DataGrid.Columns> 

Wenn ich irgendwie auf Field1 Spalte es in Ordnung ist, wenn ich irgendwie auf Field2 Spalte und es gibt keine null Field2 es feine Objekte ist, aber manchmal gibt und das Datagrid versucht, auf dem Teilfeld (I guess) und trifft auf eine null-Ausnahme zu sortieren:

System.InvalidOperationException was unhandled 
    Message=The SortDescriptions added are not valid. The probable solutions are to set the CanUserSort on the Column to false, or to use SortMemberPath property on the Column, or to handle the Sorting event on DataGrid. 

ich habe versucht Einstellung SortMemberPath auf „MyObject.Field2.SubField“ aber natürlich das es nicht, da nicht beheben Feld2 ist immer noch manchmal null. Ich habe mich gefragt, ob ich versuchen sollte, einen Konverter zu verwenden, wo ich den SortMemberPath setze und diesen Konverter string.empty für alle NULL-Elemente zurückgeben lasse, aber es nicht zum Laufen bringen konnte.

Ich habe auch versucht, "TargetNullValue = {x: Static sys: String.Empty}" innerhalb der Bindung dieser Spalten, aber es hat immer noch nicht funktioniert.

Alle Ratschläge/Vorschläge würden am meisten geschätzt werden. Danke, Will

+1

Sie können einfach sicherstellen, dass Ihr Objekt niemals null ist, indem Sie einen Konverter verwenden oder ihn nur instanziieren (wenn es null ist), wenn Sie die Daten für das Datagrid abrufen. –

Antwort

9

Allgemeine Hinweise wäre: Verwenden Sie nicht SortMemberPath. Nicht nur wegen des Problems, das Sie gerade getroffen haben. Aber auch, weil sie ultraslow sind.

Verwenden Sie stattdessen die CustomSort-Eigenschaft der ListCollectionView-Klasse. Für weitere Details lesen Sie "Improving Microsoft DataGrid CTP sorting performance" und "Improving Microsoft DataGrid CTP sorting performance - Part 2". Obwohl es "Leistung verbessern" sagt, zeigt es auch, wie Sie Ihr Problem beheben können.

Hoffe das hilft :).

+0

Danke Anvaka, Große Links, ich habe die benutzerdefinierte Sortierung wie oben implementiert und selbst für die relativ bescheidene Datenlast in meinem Raster ist die Sortiergeschwindigkeit merklich schneller. Der einzige Nachteil ist, dass ich jetzt die Fähigkeit verloren habe, mehrere Sortierungen durchzuführen, da jede neue benutzerdefinierte Sortierung die vorherige überschreibt. Ich versuche einen Weg zu finden, dies jetzt zu tun, könnte eine neue Frage sein! – WillH

+0

Danke, das war auch mein Problem! http://stackoverflow.com/questions/4086234/wpf-toolkit-datagrid-sorting-with-null-values – Falcon