2016-10-27 1 views
0

Est-il possible d'avoir les éléments sélectionnés d'un ListBox comme ListBoxItem en cas SelectionChanged (sur le ListBox) dans WPF?ListBox.SelectedItems WPF comme ListBoxItem

En ce moment, quand j'appelle listBox.SelectedItems j'obtiens la liste d'articles dans le format de ma source de données.

Par exemple, quand je crée mon ListBox je lie à un CustomListBoxViewModel comme source de données, donc quand j'ai appelé SelectedItems je reçois une liste de CustomListBoxViewModel objets.

Merci!

EDIT:

Le code qui a été donné dans la réponse choisie a parfaitement fonctionné pour mon cas d'utilisation. D'autre part, je comprends parfaitement qu'il s'agit d'une violation du modèle MVVM. Je vais utiliser le code que vous avez fourni dans le code d'une vue xaml.

La raison derrière ma question initiale était que j'ai besoin d'implémenter un ListBox qui a quelques handicapés ListBoxItems à l'intérieur. Ces articles devraient être non sélectionnables.

J'ai essayé d'utiliser une propriété attachée IsSelectable sur mon ListBoxItems et cela n'a pas bien fonctionné. Cette propriété attachée a été grandement inspirée par ce post. Le problème était que lorsque je sélectionnais directement un élément désactivé, la propriété jointe fonctionnait parfaitement. L'élément n'a pas pu être sélectionné et il ne figurait pas dans la collection SelectedItems. Mais si je voulais sélectionner tous les éléments en appuyant sur CTRL + A, tous les ListBoxItems ont été sélectionnés même les handicapés et ont été trouvés dans la collection SelectedItems.

+0

Non, ce n'est pas comme ça que ça fonctionne. – Will

+0

@Will j'ai mis à jour la question avec la raison pour laquelle je veux faire cela. C'est la "meilleure" façon de le faire à laquelle j'ai pensé ... Peut-être qu'il y a une meilleure façon de le faire? – EverydayLearner

Répondre

4

Quelle que soit la raison pour laquelle vous le faites, c'est probablement une violation grave de MVVM que vous regretterez amèrement pour le reste de votre vie.

Mais la première étape sur la voie de la perdition est toujours facile.

Voilà comment:

var listBox = (ListBox)sender; 
var selectedListBoxItems = 
    listBox.SelectedItems.Cast<Object>() 
    .Select(item => (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item)) 
    .ToList(); 

ne viennent pas pleurer pour moi quand tout se termine en larmes.

Non mais sérieusement, il ya sont quelques bonnes raisons de faire ce genre de chose dans WPF, mais ils sont beaucoup moins fréquents que ce que les nouveaux utilisateurs de WPF attendraient. Pratiquement tout cas normal est mieux géré en ayant votre code C# interagissant uniquement avec vos éléments de données, et faire des choses à la ListBoxItems en XAML via des styles et des modèles. Une fois que vous vous êtes habitué à cette façon de penser, c'est très puissant, flexible, productif et maintenable. Codebehind est ce que vous faites pour les cas bizarres lorsque toutes les autres avenues raisonnables échouent. Faites glisser et déposez, par exemple.

+1

Je comprends totalement que c'est mauvais. J'ai ajouté la raison pour laquelle je demandais cela dans le montage de ma question. Peut-être qu'il y a une meilleure façon de le faire. – EverydayLearner

+1

@m.lachance En lisant votre question mise à jour, ma première réaction est "Oh, mec, viens le claquer dans codebehind". C'est certainement le genre de chose que vous feriez souvent dans codebehind - une solution de propriété jointe peut être meilleure, mais très souvent, l'emploi du temps réel ne vous permet pas de construire le Parthénon. Mais voler le Parthénon est une autre affaire; Je vais jeter un oeil à ce poste de coderelief.net et voir si ce code fonctionne pour moi. –