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

.net binding entity-framework vb.net wpf

Question

J'essaie d'obtenir des images à afficher dans une liste WPF ressemblant à un WrapPanel, comme décrit dans cet ancien article de l'équipe ATC Avalon: Comment créer une vue personnalisée .

Images WPF ListView WrapPanel

Lorsque j'essaie de remplir le ListView avec une collection d'objets ADO.NET Entity Framework interrogée par LINQ-to-Entities, 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

<ListView Name="ListViewImages"
          SelectionMode="Single"
          ItemsSource="{Binding}">
    <local:ImageView />
</ListView>

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

Réponse acceptée

La raison pour laquelle cette exception particulière est levée est que le contenu de l'élément est appliqué à la collection Items de ListView. Le XAML initialise donc le ListView avec un seul fichier local: ImageView dans sa collection Items. Toutefois, lorsque vous utilisez un élément ItemsControl, vous devez utiliser la propriété Items ou la propriété ItemsSource. Vous ne pouvez pas utiliser les deux en même temps. Par conséquent, lorsque l'attribut ItemsSource est traité, une exception est levée.

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

[ContentPropertyAttribute("Items")]

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

Corrigez le XAML et l'exception disparaît:

<ListView Name="ListViewImages"
          SelectionMode="Single"
          ItemsSource="{Binding}">
    <ListView.View>
        <local:ImageView />
    </ListView.View>
</ListView>

Il manquait cette <ListView.View> .


Réponse populaire

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

<wpftoolkit:DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding Path=Accounts}" >
    <wpftoolkit:DataGridTextColumn 
        Header="Account Name" 
        Binding="{Binding Path=AccountName}" />
</wpftoolkit:DataGrid>

que j'ai fixé pour être

<wpftoolkit:DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding Path=Accounts}" >
    <wpftoolkit:DataGrid.Columns>
        <wpftoolkit:DataGridTextColumn 
            Header="Account Name" 
            Binding="{Binding Path=AccountName}" />
    </wpftoolkit:DataGrid.Columns>
</wpftoolkit:DataGrid>


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow