2011-04-04 6 views
1

J'ai une zone de liste dans WPF qui est liée à un ObservableCollection à l'aide de la propriété ItemSource. Cela fonctionne très bien, les éléments corrects sont affichés. La zone de liste (qui contient une liste de noms d'image) possède un gestionnaire d'événements sur l'événement SelectionChanged qui met à jour la source d'un contrôle Image avec le chemin d'accès à l'image sélectionnée (donnant ainsi un aperçu de l'image).WPF Suppression d'un élément de la zone de liste

J'ai le code suivant pour supprimer un élément de la lisbox, sur l'événement de clic d'un bouton:

if (lstLocal.SelectedIndex > -1) 
{ 
    localImages.RemoveAt(lstLocal.SelectedIndex); 
} 

localImages étant le ObservableCollection et lstLocal étant le ListBox. Cependant, lorsque je supprime l'élément sélectionné, l'événement SelectionChanged se déclenche. Mon gestionnaire d'événements SelectionChanged utilise la propriété SelectedIndex dans la zone de liste. Je reçois l'exeption Index was out of range. Must be non-negative and less than the size of the collection., donc je devine que la suppression d'un élément entraîne SelectedIndex à quelque chose comme null (ou un nombre négatif)?

Y at-il un moyen de contourner ce problème? Je suppose qu'il y a une meilleure façon pour moi de supprimer des éléments, ou j'ai besoin d'une sorte de vérification sur mon gestionnaire SelectionChanged?

Répondre

1

Enroulez le code dans votre gestionnaire SelectionChanged dans un

if (lstLocal.SelectedItem != null) 
{ 
... 
} 
+0

Merci. Je pense que j'ai eu un moment d'oubli là-bas! – AndrewC

1

Ah, une gêne classique du contrôle ListBox. Lors de la modification de la collection liée, elle peut effacer la sélection et réinitialiser la position de défilement vers le haut. C'est vraiment énervant quand vous devez sélectionner des éléments dans une liste et les éditer au coup par coup dans le cadre d'un flux de travail.

Vous pouvez conserver une référence d'objet "élément actuellement sélectionné" lorsque vous modifiez la liste afin de conserver la sélection si quelque chose change dans les coulisses. Ensuite, vous pouvez également vous assurer que si elle existe, elle reste visible en revenant à cet élément à l'aide de la méthode ScrollIntoView. Un SelectedIndex de -1 signifie que rien n'est sélectionné, comme vous vous en souvenez déjà. Ceci est un ancien hold-over de pre-.NET, avant que la propriété SelectedItem existe. De nos jours SelectedItem sera nul en même temps que SelectedIndex est -1.

Questions connexes