2009-10-29 7 views
7

J'ai une base de données WPF que j'utilise avec un certain nombre de colonnes. Une des colonnes a quelques éléments qui sont parfois NULL et cela provoque une exception quand j'essaye de trier sur cette colonne.WPF Datagrid trier sur une colonne avec des éléments NULL

Les définitions des colonnes est quelque chose comme:

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

Si je sorte sur la colonne Champ1 il est très bien, si je tri sur la colonne Champ2 et il n'y a pas nul objets Champ2 il est très bien, mais parfois il sont et DataGrid essaie de trier sur le sous-champ (je suppose) et frappe une exception nulle:

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. 

J'ai essayé d'installer SortMemberPath à « MyObject.Field2.SubField » mais bien sûr, cela ne résout pas depuis Le champ 2 est toujours parfois nul. Je me suis posé la question d'essayer d'utiliser un convertisseur où j'ai défini SortMemberPath et que ce convertisseur retourne string.empty pour tous les éléments NULL mais n'a pas réussi à le faire fonctionner.

J'ai également essayé d'ajouter "TargetNullValue = {x: Static sys: String.Empty}" dans la liaison de ces colonnes mais cela ne fonctionnait toujours pas.

Des conseils/suggestions seraient les bienvenus. Merci, Will

+1

Vous pouvez simplement vous assurer que votre objet n'est jamais nul à l'aide d'un convertisseur ou simplement l'instancier (s'il est nul) lorsque vous obtenez les données pour la grille de données. –

Répondre

9

Conseil général serait: Ne pas utiliser SortMemberPath. Pas seulement à cause du problème que vous venez de rencontrer. Mais aussi parce qu'ils sont ultra-légers. Au lieu de cela, utilisez la propriété CustomSort de la classe ListCollectionView.

Pour plus de détails, lisez "Improving Microsoft DataGrid CTP sorting performance" et "Improving Microsoft DataGrid CTP sorting performance - Part 2". Bien qu'il dise "améliorer les performances", il montre également comment résoudre votre problème.

Espérons que cela aide :).

+0

Merci Anvaka, Liens excellents, j'ai mis en œuvre le tri personnalisé comme ci-dessus et même pour la charge de données relativement modeste dans ma grille la vitesse de tri est nettement plus rapide. Le seul inconvénient est que j'ai perdu la capacité de faire plusieurs sortes maintenant puisque tout nouveau tri personnalisé écrase le précédent. J'essaie de trouver un moyen de le faire maintenant, pourrait être une nouvelle question! – WillH

+0

merci, ça a été mon problème, aussi! http://stackoverflow.com/questions/4086234/wpf-toolkit-datagrid-sorting-with-null-values – Falcon

Questions connexes