2010-07-09 5 views
0

J'ai une grille de données silverlight qui est liée à une PagedCollectionView affichant une collection de RowViewModels. Chaque RowVM possède une collection de CellViewModels, et les colonnes DataGrid sont templatecolumns et sont générées dynamiquement avec leur contenu lié à Cell [0] .Content, Cell [1] .Content, etc. En effet, les RowviewModels sont retournés à partir d'un service, et peut contenir n'importe quel nombre de colonnes et différents types de contenu.Tri d'une PagedCollectionView par index (à l'aide de SilverLine Datagrid)

Cela fonctionne très bien, mais j'ai rencontré des problèmes lors de l'activation du tri des colonnes dans le DataGrid. Il semble que la propriété SortMemberPath sur DataGridColumns (qui à la fin devient un SortDescription.PropertyName) ne fonctionnera pas avec une expression contenant un index, comme "Cells [1] .Content".

Est-ce que quelqu'un sait un moyen de contourner cela?

Répondre

0

Répondre à ma propre question ici. J'ai résolu cela en plaçant SortMemberPath sur mes colonnes générées à leur numéro d'index dans la collection RowVM.Cells, et ajouté une propriété SortOnMe à mon RowVMs. Lorsque l'utilisateur trie la grille de données, il ajoute une description de tri contenant le numéro d'index (extrait de SortMemberPath) à PagedCollectionView. Je surveille cela en écoutant l'événement propertychanged sur PagedCollectionView avec la méthode ci-dessous. Il ajoute une nouvelle SortDescription indiquant à PagedCollectionView de trier "SortOnMe" et copie les données à trier de la cellule en question vers row.SortOnMe.

private bool _currentlySorting; 
private void PagedCollectionView_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    var pcv = (PagedCollectionView)sender; 
    int columnIndex = 0; 
    if (!_currentlySorting && e.PropertyName == "SortDescriptions" && pcv.SortDescriptions.Count == 1 && int.TryParse(pcv.SortDescriptions[0].PropertyName, out columnIndex)) { 
     _currentlySorting = true; 
     pcv.SortDescriptions.Add(new SortDescription("SortOnMe", pcv.SortDescriptions(0).Direction)); 
     foreach (RowViewModel row in pcv.SourceCollection) { 
      row.SortOnMe = row.Cells(columnIndex).Content; 
     } 
     _currentlySorting = false; 
    } 
} 

C'est une solution assez moche, pour être honnête. Mais ça marche, et j'ai passé trop de temps à me cogner la tête contre ce mur maintenant.

Puisque PagedCollectionView est une classe scellée (pourquoi ?!), la seule autre façon que je pourrais envisager de faire ceci serait de créer mon propre PagedCollectionView et de gérer le tri là.

0

Vous pouvez générer un objet dynamique basée dans la collecte de CellViewModels

Voir cette

Lightweight DataTable for your Silverlight applications

Meilleures salutations.

Bruno Rocha

+0

Salut! Merci pour votre réponse, mais je ne suis pas sûr de savoir comment cela se rapporte à mon problème avec le tri de la toolbar silverlight toolagrid? – Zissou

Questions connexes