179 votes

"La collection d'éléments doit être vide avant d'utiliser ItemsSource."

Je tente d'afficher des images dans un ListView WPF stylisé comme un WrapPanel tel que décrit dans cet ancien article de l'équipe ATC Avalon : Comment créer une vue personnalisée.

Lorsque j'essaie de remplir le ListView avec une collection obtenue à partir d'une requête LINQ-to-Entities sur des objets ADO.NET Entity Framework, j'obtiens l'exception suivante :

Exception

La collection Items doit être vide avant d'utiliser ItemsSource.

Mon code…

Visual Basic

Private Sub Window1_Loaded(...) Handles MyBase.Loaded
    ListViewImages.ItemsSource = From g In db.Graphic _
                                 Order By g.DateAdded Ascending _
                                 Select g

XAML

J'ai mis un point d'arrêt sur cette ligne. ListViewImages.ItemsSource est Nothing juste avant l'affectation LINQ.

193voto

qntmfred Points 10246

J'ai eu cette même erreur pendant un certain temps dans un scénario légèrement différent. La cause était un XAML invalide, car certaines balises manquaient.

J'avais

que j'ai corrigé pour être

16 votes

Merci! Un problème si simple... mais une erreur si déroutante.

18 votes

Pour moi, la différence était simplement de ne pas avoir inclus les (et je n'utilisais même pas le wpftoolkit).

2 votes

Il me manque aussi les balises .

129voto

Dave Points 2554

La raison pour laquelle cette exception particulière est déclenchée est que le contenu de l'élément ListView est appliqué à la collection d'éléments. Ainsi, le XAML initialise le ListView avec un seul local:ImageView dans sa collection Items. Mais lors de l'utilisation d'un ItemsControl, vous devez utiliser soit la propriété Items soit la propriété ItemsSource, vous ne pouvez pas utiliser les deux en même temps. Par conséquent, lors du traitement de l'attribut ItemsSource, une exception est levée.

Vous pouvez découvrir à quelle propriété le contenu d'un élément sera appliqué en recherchant l'attribut ContentPropertyAttribute sur la classe. Dans ce cas, il est défini plus haut dans la hiérarchie de la classe, sur l'ItemsControl :

[ContentPropertyAttribute("Items")]

Le but ici était que la vue du ListView soit définie sur un local:ImageView, donc la solution est d'indiquer explicitement la propriété à définir.

Corrigez le XAML et l'exception disparaîtra :

Le tag était manquant.

6 votes

Cette réponse est correcte. Mais avant de vérifier cela, assurez-vous que votre XAML est correct comme indiqué dans d'autres réponses. Sinon, vous pouvez passer beaucoup de temps à regarder seulement les éléments de ItemSource pour finalement découvrir que c'est causé par une petite faute de frappe.

73voto

Armentage Points 1512

Je viens de tomber sur un exemple TRÈS insidieux de ce problème. Mon fragment original était beaucoup plus complexe, ce qui rendait difficile de voir l'erreur.

      >

Le bug ? Le > supplémentaire après la balise d'ouverture initiale ! Le << a été appliqué à la collection d'éléments intégrée. Lorsque le DataContext a été défini ultérieurement, crash instantané. Alors, soyez vigilant, et recherchez plus que simplement des erreurs entourant vos enfants de données spécifiques à ItemsControl lorsque vous déboguez ce problème.

4 votes

Il m'est arrivé la même chose: Extra > => Exception

8 votes

Bien sûr, ce n'est pas seulement > qui fera cela. Tous les caractères tapés accidentellement deviendront des éléments à part entière. Vous pouvez vérifier cette condition en supprimant temporairement votre attribut ItemsSource. Si vous avez toujours des lignes dans la grille de données, vous devez vérifier les caractères superflus.

5 votes

Armentage... tu viens de me sauver je ne sais combien d'heures de recherche pour ça !!! Merci beaucoup d'avoir posté ceci... vote positif!

41voto

Junior Mayhé Points 5202

Moi aussi dans un scénario différent.

Maintenant, lorsque vous complétez avec la balise manquante Control.ItemTemplate, tout revient à la normale :

1 votes

Pourquoi WPF doit-il être si mauditement peu évident? Définir le DataTemplate pour une ListBox a provoqué des exceptions amusantes mais aucune d'elles ne menait dans la bonne direction.

0 votes

Cela s'est fixé pour moi en utilisant un .

27voto

ehudbk Points 91

J'ai eu cette même erreur dans un scénario différent

La solution était d'ajouter la balise ItemsControl.ItemsPanel avant la balise ItemsPanelTemplate

0 votes

C'est ce qui a résolu mon problème!

0 votes

Le ItemsControl n'a pas été trouvé

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X