2009-12-01 4 views
0

Lorsque vous utilisez le DataGrid Silverlight avec une source de données dérivées IList il est possible de cliquer sur une colonne pour la trier, en supposant les CanUserSortColumns/propriétés CanUserSort ne sont pas fausses.Datagrid ne peut pas trier sur certains champs - objet, sous-champ d'objet, type de base

Cependant je trouve certains cas limites ne peuvent pas être triés par - les valeurs sont indiquées, mais en cliquant sur la colonne n'a pas d'effet.

Les premiers cas de pointe semblent être le List<string> très simple, qui montre les valeurs, mais ne permet pas de tri. Cela n'a pas beaucoup de sens en tant qu'implications IComparable.

Le deuxième cas limite est beaucoup plus complexe, et peut-être besoin d'un travail autour. Le second cas concerne des champs et des sous-champs de type objet.

public class ContainerItem 
{  
    public object ChildValue {get; set;} 

    // Other properties 
} 

La valeur de valeurEnfant peut être affiché dans la grille, et si le type attribué à valeurEnfant a des propriétés, nous pouvons également se lier à eux (valeurEnfant. Propriété), mais nous ne pouvons pas trier la colonne.

Il est évident que l'absence d'un type défini est un problème ici - il y aurait évidemment des problèmes si les objets où de différents types, incompatibles. Dans ma situation spécifique, je suis coincé avec ceci comme ChildValue est attribué dynamiquement, tout comme les définitions de liaison de colonne. Il semble évident que j'ai besoin d'un travail - j'ai le contrôle sur la définition de classe ContainerItem, et les liaisons aux propriétés de ChildValue sont toujours OneWay (seules les propriétés fixes de ContainerItem utilisent une liaison bidirectionnelle). Pourrais-je utiliser le SortMemberPath et le lier à une propriété tableau de ContainerItem, où chaque élément du tableau est un objet ContainerItemComparer rempli avec les informations de liaison de la colonne afin qu'il puisse extraire les valeurs des deux propriétés ChildValue , comparez-les et renvoyez le résultat sans que DataGrid sache que les propriétés sont des objets nus?

Répondre

1

Je pense que le premier cas de bord est assez artificiel. Pourquoi lieriez-vous une liste de chaînes à un DataGrid? Cela ne fonctionne probablement pas car il n'y a pas de nom de propriété à utiliser comme chemin de tri. Pour la question du tri dynamique, vous feriez mieux de mettre en œuvre ICollectionView dans votre collection. Ensuite, vous pouvez contrôler le tri manuellement mais vous voulez le manipuler sans essayer de le forcer à travailler à partir de la construction dans le tri.

Questions connexes