J'ai retourné un Horizontal ItemsControl à une Listbox pour que je puisse sélectionner des éléments individuels mais que la sélection était cassée. J'ai pris le temps de distiller le bit problématique.Bogue de sélection pour la zone de liste dans laquelle les éléments de liste sont des types/structures de valeur et contiennent des doublons?
Books = new[] { new Book{Id=1, Name="Book1"},
new Book{Id=2, Name="Book2"},
new Book{Id=3, Name="Book3"},
new Book{Id=4, Name="Book4"},
new Book{Id=3, Name="Book3"},
};
<DataTemplate DataType="{x:Type WPF_Sandbox:Book}">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
<ListBox ItemsSource="{Binding Books}"/>
Si livre est un struct, la sélection listbox (mode par défaut: simple) va mal tourné si vous sélectionnez un élément qui a une struct équivalent dans la liste. par exemple, Book3
Si Book est transformé en classe (avec une sémantique de type sans valeur), la sélection est fixe.
choix (jusqu'à présent, ne pas comme l'un d'eux):
- J'ai choisi parce que son struct une petite structure de données et la sémantique du type de valeur sont utiles pour comparer les 2 cas pour l'égalité. Le changer en une classe me fait perdre la sémantique de type valeur. Je ne peux plus utiliser les Equals par défaut ou le remplacer pour la comparaison de membres.
- Ajoutez un attribut Book différentiateur uniquement pour que la sélection de la zone de liste fonctionne (par exemple, un index).
- Éliminer les doublons .. Pas possible.
WPF listbox : problem with selection: indique que la zone de liste est mise SelectedItem et en mettant à jour l'interface utilisateur pour cela, il allume juste en haut tous les éléments de la liste qui Equal(SelectedItem)
. Je ne sais pas pourquoi .. en soulignant SelectedIndex ferait disparaître ce problème; peut-être qu'il me manque quelque chose. ListBox is selecting many items even in SelectionMode="Single": montre le même problème lorsque les éléments de la liste sont des chaînes (sémantiques de type valeur)
Vous dites que vous ne pouvez pas remplacer 'Equals' si vous utilisez un' class'. Pourquoi pas? Le remplacement de 'Equals' est fortement recommandé lors de la création d'un' struct', donc vous ne devriez pas utiliser 'struct' juste pour obtenir une implémentation' Equals' avec la sémantique des valeurs. En passant, ce comportement n'est pas limité aux structs. Si vous vous liez à un type de classe qui remplace Equals et que deux instances distinctes sont égales, vous verrez le même comportement. –
@Kent - exactement. Ce que j'ai est une structure de données simple, de sorte que si 2 instances ont les mêmes membres, elles sont équivalentes. Tout allait bien jusqu'à ce que j'aie besoin d'une liste avec des éléments sélectionnables .. Je pourrais le transformer en classe .. mais si j'écarte Equals pour faire comparer memberwise, je serais de retour à la case 1 (comme je l'ai indiqué avec le second SO q link) où listbox des chaînes montre le même problème). Si je ne remplace pas, j'ai besoin d'une méthode customEquals pour comparer les membres. Donc, il semble que l'ajout d'un paramètre de différenciation (comme un horodatage ou index unique) à la structure est la meilleure option .. – Gishu