Objet collectionviewsource tri uniquement la première fois qu'il est lié à une source de
Je suis à l'aide d'une grille de données lié à un objet collectionviewsource (joueurs), lui-même lié à l'élément sélectionné d'une zone de liste (niveaux), chaque élément contenant une collection à trier/affiché dans la grille de données:
<ListBox Name="lstLevel"
DisplayMemberPath="Name"
IsSynchronizedWithCurrentItem="True" />
...
<!-- DataGrid source, as a CollectionViewSource to allow for sorting and/or filtering -->
<CollectionViewSource x:Key="Players"
Source="{Binding ElementName=lstLevel,
Path=SelectedItem.Players}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Name" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
...
<DataGrid Name="lstPlayers" AutoGenerateColumns="False"
CanUserSortColumns="False"
ItemsSource="{Binding Source={StaticResource Players}}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Path=Name, Mode=TwoWay}"
Width="*" />
<DataGridTextColumn Header="Age"
Binding="{Binding Path=Age, Mode=TwoWay}"
Width="80">
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
(tout le code C#ici, code XAML ici, l'ensemble du projet de test ici - en plus de la grille de données, j'ai ajouté une simple zone de liste pour les joueurs, pour s'assurer qu'il n'était pas un DataGrid question)
Le problème est que les joueurs sont triées de la première fois qu'ils apparaissent, mais dès que je sélectionne un autre niveau de la zone de liste, ils ne sont pas triés plus. Aussi, la modification des noms de la première fois que les joueurs sont affichés sur les trier en conséquence de ces changements, mais ne l'est plus une fois que le niveau a été changé.
Donc il semble que la modification de la source de l'objet collectionviewsource en quelque sorte des sauts de la fonctionnalité de tri, mais je n'ai aucune idée pourquoi, ni comment le résoudre. Personne ne sait ce que je fais mal?
(J'ai fait un test avec un filtre, mais que l'on a continué à travailler comme prévu)
Le cadre est .NET 4.
- J'ai vécu la même chose avant -- au lieu de créer un nouvel objet à chaque fois, pouvez-vous vous retirez et réinsérez de son contenu?
- Outre le travail supplémentaire, qui serait inutilement fragment le tas managé par la création/validation des objets, je préfère éviter si je le pouvais.
Vous devez vous connecter pour publier un commentaire.
Excellente question et une observation intéressante. Regardant de plus près, il apparaît que le contrôle DataGrid efface trier les descriptions d'un précédent ItemsSource avant un nouveau jeu. Voici son code pour OnCoerceItemsSourceProperty:
Ce problème se produit uniquement sur un DataGrid. Si vous avez utilisé une zone de liste à la place (pour afficher les "Joueurs" de la collection ci-dessus), le comportement sera différent et la SortDescriptions restera toujours après avoir sélectionné les différents éléments de la mère datagrid.
Donc je suppose que la solution est donc, en quelque sorte ré-appliquer le tri des descriptions des Joueurs de collection chaque fois l'élément sélectionné dans la grille de données (c'est à dire "lstLevel") des changements.
Cependant, je ne suis pas sûr à 100% sur ce et a probablement besoin de plus de tests et d'enquête. J'espère que j'ai été en mesure de contribuer de quelque chose de bien. =)
EDIT:
D'une proposition de solution, vous pouvez ajouter un gestionnaire pour lstLevel.SelectionChanged dans votre constructeur, avant de définir la lstLevel.Propriété ItemsSource. Quelque chose comme ceci:
EDIT2:
En réponse aux problèmes que vous avez rencontrer en ce qui concerne la navigation au clavier, je suggère qu'au lieu de la manipulation de la "CurrentChanged" de l'événement, vous permet de gérer les lstLevel.SelectionChanged événement à la place. Je suis en affichant les mises à jour nécessaires que vous devez faire ci-dessous. Il suffit de copier-coller de votre code et de voir si il fonctionne très bien.
XAML:
Code-behind (constructeur):
J'ai été en mesure de résoudre ce problème en appelant simplement PropertyChanged sur la propriété qui expose le point de vue, en laissant l'actualisation de la vue (et effacer le tri), puis en ajoutant le tri des descriptions.
Une meilleure solution de contournement:
Objet collectionviewsource tri uniquement la première fois qu'il est lié à une source de