“La collection d’éléments doit être vide avant d’utiliser ItemsSource.”

J’essaie de faire en sorte que les images s’affichent dans un WPF ListView de style WrapPanel, comme décrit dans cet ancien article ATC Avalon Team: Comment créer un affichage personnalisé .

Images WPF ListView WrapPanel

Lorsque j’essaie de remplir le ListView avec une collection d’interrogations LINO-to-Entities d’objects ADO.NET Entity Framework, j’obtiens l’exception suivante:

Exception

La collection d’éléments 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 End Sub 

XAML

    

Je mets un point d’arrêt sur cette ligne. ListViewImages.ItemsSource est Nothing juste avant l’affectation LINQ.

La raison de cette exception particulière est que le contenu de l’élément est appliqué à la collection Items de ListView. Ainsi, le XAML initialise le ListView avec un seul local: ImageView dans sa collection Items. Mais lorsque vous utilisez un ItemsControl, vous devez utiliser la propriété Items ou la propriété ItemsSource, que vous ne pouvez pas utiliser simultanément. Par conséquent, lorsque l’atsortingbut ItemsSource est traité, une exception est levée.

Vous pouvez trouver à quelle propriété le contenu d’un élément sera appliqué en recherchant le ContentPropertyAtsortingbute sur la classe. Dans ce cas, il est défini plus haut dans la hiérarchie des classes, sur ItemsControl:

 [ContentPropertyAtsortingbute("Items")] 

L’intention ici était que la vue de ListView soit définie sur un local: ImageView afin que le correctif indique explicitement la propriété à définir.

Corrigez le XAML et l’exception disparaît:

      

Il manquait cette .

J’ai eu la même erreur pendant un moment dans un scénario légèrement différent. j’avais

    

que je fixe pour être

      

Je viens de rencontrer un exemple TRÈS insidieux de ce problème. Mon fragment original était beaucoup plus complexe, ce qui compliquait la lecture de l’erreur.

   >         

L’insecte? L’extra > après la ouverture initiale! Le < été appliqué à la collection d'éléments intégrée. Lorsque le DataContext a été défini plus tard, crashola instantanée. Donc, surveillez bien plus que les erreurs qui entourent vos enfants de données spécifiques à ItemsControl lors du débogage de ce problème.

Moi aussi sur un scénario différent.

             

Maintenant, lorsque vous terminez avec la balise manquante Control.ItemTemplate , tout devient normal:

               

J’ai eu la même erreur dans un scénario différent

      

La solution consistait à append la balise ItemsControl.ItemsPanel avant le ItemsPanelTemplate

        

Exception

La collecte d’éléments doit être vide avant d’utiliser ItemsSource.

Cette exception se produit lorsque vous ajoutez des éléments à ItemsSource via différentes sources . Donc, assurez-vous de ne pas avoir accidentellement oublié une balise, égaré une balise, ajouté des balises supplémentaires ou mal écrit une balise.

              

Alors que ItemsControl.ItemsSource est déjà défini via Binding , les autres éléments (Grid, Button, …) ne peuvent pas être ajoutés à la source. Cependant, lorsque ItemsSource n’est pas utilisé, le code suivant est autorisé :

       

remarquez la partie ItemsSource="{Binding MyItems}" .

Énoncer la réponse différemment; vérifiez qu’il n’y a pas de nœuds parents manquants ou de nœuds incorrects .

Cela a échoué:

Aucun parent (ou parent incorrect) pour le nœud enfant ItemsPanelTemplate

     ...  

Cela a fonctionné:

        ...  

Conservez la colonne de modèle à l’intérieur de DataGrid.Columns. Cela m’a aidé à résoudre ce problème.

Ref: DataGridTemplateColumn: La collection d’éléments doit être vide avant d’utiliser ItemsSource.

Dans mon cas, c’était juste un StackPanel supplémentaire dans le ListView:

            

Devient:

          

et tout va bien.

Dans mon cas, il n’utilisait pas un DataTemplate pour ItemsControl.

Vieux:

       

Nouveau:

           

Le mien était avec un style datagrid. Si vous balises autour du style, vous rencontrez ce problème. Chose étrange, cela a fonctionné pendant un moment comme ça. Voici le mauvais code.

    

et le bien

      

J’ai eu cette erreur lorsque j’ai essayé d’appliquer des menus contextuels à mon TreeView . Ces essais ont abouti à un mauvais XAML qui compilait en quelque sorte:

  ContextMenu="">  ... 

Notez la ligne problématique: ContextMenu=""> .
Je ne sais pas pourquoi il a été compilé, mais j’ai pensé que cela valait la peine d’être mentionné comme raison de ce message d’exception cryptique. Comme Armentage l’a dit, examinez attentivement le XAML, en particulier dans les endroits que vous avez récemment modifiés.

J’ai eu la même erreur. Le problème était ce symbole supplémentaire “>” ajouté par erreur entre les balises et :

     >  

et voici le code correct:

      

Peut-être pas une réponse si utile, mais j’ai eu le même problème lors de la modification de l’ordre des colonnes et j’ai fait des erreurs comme celle de l’exemple suivant. Ayant beaucoup de colonnes, je les ai réorganisées et collées d’une manière ou d’une autre après la fermeture de la balise /DataGrid.Columns :

                  

En tout cas, a perdu une demi-heure à cause de cela. J’espère que cela aide les autres.

Attention aux fautes de frappe! J’ai eu le suivant

   ... >  

(Notez le tailing > , qui est interprété comme du contenu, donc vous définissez deux fois le contenu … ça m’a pris du temps 🙂