"Les éléments de la collection doit être vide avant d'utiliser ItemsSource."

j'essaie d'obtenir des images à afficher dans une ListView WPF coiffée comme un WrapPanel comme décrit dans cet ancien article de L'équipe D'Avalon ATC: comment créer une vue personnalisée .

WPF ListView WrapPanel Images

quand j'essaie de remplir le ListView avec une collection de LINQ-to-Entities ADO.NET Entity Framework objects I get the following exception:

Exception

collection d'Éléments doit être vide avant 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>

j'ai mis un point d'arrêt sur cette ligne. ListViewImages.ItemsSource est Nothing juste avant L'assignation LINQ.

151
demandé sur Grant Winney 2009-03-26 02:02:11

15 réponses

la raison pour laquelle cette exception particulière est rejetée est que le contenu de l'élément est appliqué à la collection D'Articles de ListView. Ainsi, XAML initialise le ListView avec un seul local:ImageView dans sa collection D'objets. Mais lorsque vous utilisez un ItemsControl vous devez utiliser soit 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 lancée.

vous pouvez le découvrir quelle propriété le contenu d'un élément sera appliqué en recherchant la propriété ContentPropertyAttribute sur la classe. Dans ce cas ,c'est défini supérieur dans la hiérarchie de classe, sur le ItemsControl:

[ContentPropertyAttribute("Items")]

l'intention ici était que la vue de ListView soit définie à un local:ImageView de sorte que le correctif indique explicitement la propriété à définir.

"151930920 de" Résoudre le XAML et l'exception disparaît:

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

il manquait cette étiquette <ListView.View> .

110
répondu Dave 2009-03-27 00:33:10

j'ai eu cette même erreur pendant un certain temps 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é à ê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>
163
répondu kenwarner 2009-08-07 01:26:48

je viens de tomber sur un exemple très insidieux de ce problème. Mon fragment d'origine était beaucoup plus complexe, il est difficile de voir l'erreur.

   <ItemsControl           
      Foreground="Black"  Background="White" Grid.IsSharedSizingScope="True"
      x:Name="MyGrid" ItemsSource="{Binding}">
      >
      <ItemsControl.ItemsPanel>
           <!-- All is fine here -->
      </ItemsControl.ItemsPanel>
      <ItemsControl.ItemTemplate>
           <!-- All is fine here -->
      </ItemsControl.ItemTemplate>
      <!-- Have you caught the error yet? -->
    </ItemsControl>

le bug? Le supplément > après l'ouverture initiale <ItemsControl> étiquette! Le < a été appliqué à la collection d'articles intégrés. Quand le DataContext a été plus tard défini, crashola instantanée. Donc, recherchez plus que de simples erreurs autour de vos données spécifiques à ItemsControl. les enfants lors du débogage de ce problème.

54
répondu Armentage 2014-10-10 00:49:51

moi aussi dans un autre scénario.

<ComboBox Cursor="Hand" DataContext="{Binding}"  
              FontSize="16" Height="27" ItemsSource="{Binding}" 
              Name="cbxDamnCombo" SelectedIndex="0" SelectedValuePath="MemberId">

        <DataTemplate>
            <TextBlock DataContext="{Binding}">
                <TextBlock.Text>
                  <MultiBinding StringFormat="{}{0} / {1}">
                    <Binding Path="MemberName"/>
                    <Binding Path="Phone"/>
                  </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>

</ComboBox>

maintenant quand vous remplissez avec la balise manquante contrôle.ItemTemplate , tout redevient normal:

<ComboBox Cursor="Hand" DataContext="{Binding}"  
              FontSize="16" Height="27" ItemsSource="{Binding}" 
              Name="cbxDamnCombo" SelectedIndex="0" SelectedValuePath="MemberId">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock DataContext="{Binding}">
                <TextBlock.Text>
                  <MultiBinding StringFormat="{}{0} / {1}">
                    <Binding Path="MemberName"/>
                    <Binding Path="Phone"/>
                  </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    <ComboBox.ItemTemplate>
</ComboBox>
37
répondu Junior M 2010-01-19 23:10:18

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

<ItemsControl ItemsSource="{Binding TableList}">
    <ItemsPanelTemplate>
        <WrapPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>
</ItemsControl>

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

<ItemsControl ItemsSource="{Binding TableList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
22
répondu ehudbk 2016-10-17 12:43:23

Exception

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

cette exception se produit lorsque vous ajoutez des articles au ItemsSource par l'entremise de différentes sources . Si Assurez-vous que vous n'avez pas accidentellement manqué une étiquette, égaré une étiquette, ajouté des étiquettes supplémentaires, ou mal écrit une étiquette.

<!--Right-->

<ItemsControl ItemsSource="{Binding MyItems}">
     <ItemsControl.ItemsPanel.../>
     <ItemsControl.MyAttachedProperty.../>
     <FrameworkElement.ActualWidth.../>
</ItemsControl>


<!--WRONG-->

<ItemsControl ItemsSource="{Binding MyItems}">
     <Grid.../>
     <Button.../>
     <DataTemplate.../>
     <Heigth.../>
</ItemsControl>

alors que ItemsControl.ItemsSource est déjà défini par Binding , autres éléments (grille, Bouton, ...) ne peut pas être ajouté à la source. Toutefois, alors que ItemsSource est non utilisé le code suivant est autorisé :

<!--Right-->
<ItemsControl>
     <Button.../>
     <TextBlock.../>
     <sys:String.../>
</ItemsControl>

noter la partie manquante ItemsSource="{Binding MyItems}" .

12
répondu Bizhan 2017-12-08 16:48:04

pour énoncer la réponse différemment; vérifier qu'il n'y a aucun noeud Parent manquant ou noeuds incorrects .

Cet Échec:

pas de parent (ou mauvais parent) pour le ItemsPanelTemplate nœud enfant

<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
    <ItemsPanelTemplate>
        <UniformGrid Rows="1" />
    </ItemsPanelTemplate>
    ...
</ItemsControl>

Cela A Fonctionné:

<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
    <ItemsControl.ItemsPanel> <!-- I am the missing parent! -->
        <ItemsPanelTemplate>
            <UniformGrid Rows="1" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    ...    
</ItemsControl>
10
répondu ΩmegaMan 2018-05-30 15:02:26

conserver la colonne modèle dans DataGrid.Colonne. Cela m'a aidé à résoudre ce problème.

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

5
répondu Rama 2017-05-23 12:34:39

dans mon cas, c'était juste un StackPanel supplémentaire à L'intérieur du ListView:

<ListView Name="_details" Margin="50,0,50,0">
            <StackPanel Orientation="Vertical">
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Location.LicenseName, StringFormat='Location: {0}'}"/>
                    <TextBlock Text="{Binding Ticket.Employee.s_name, StringFormat='Served by: {0}'}"/>
                    <TextBlock Text="{Binding Ticket.dt_create_time, StringFormat='Started at: {0}'}"/>
                    <Line StrokeThickness="2" Stroke="Gray" Stretch="Fill" Margin="0,5,0,5" />
                    <ItemsControl ItemsSource="{Binding Items}"/>
                </StackPanel>
            </StackPanel>
        </ListView>

devient:

<ListView Name="_details" Margin="50,0,50,0">
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Location.LicenseName, StringFormat='Location: {0}'}"/>
                    <TextBlock Text="{Binding Ticket.Employee.s_name, StringFormat='Served by: {0}'}"/>
                    <TextBlock Text="{Binding Ticket.dt_create_time, StringFormat='Started at: {0}'}"/>
                    <Line StrokeThickness="2" Stroke="Gray" Stretch="Fill" Margin="0,5,0,5" />
                    <ItemsControl ItemsSource="{Binding Items}"/>
                </StackPanel>
        </ListView>

et tout va bien.

4
répondu Carl 2010-03-14 04:24:25

dans mon cas, il n'utilisait pas de Datemplate pour les ItemsControl.

:

<ItemsControl Width="243" ItemsSource="{Binding List, Mode=TwoWay}">
    <StackPanel Orientation="Horizontal">
        <TextBox Width="25" Margin="0,0,5,0" Text="{Binding Path=Property1}"/>
        <Label Content="{Binding Path=Property2}"/>
    </StackPanel>
</ItemsControl>

Nouveau:

<ItemsControl Width="243" ItemsSource="{Binding List, Mode=TwoWay}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBox Width="25" Margin="0,0,5,0" Text="{Binding Path=Property1}"/>
                <Label Content="{Binding Path=Property2}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
4
répondu samiz 2011-12-16 19:29:41

Mine était avec un Style datagrid. Si vous omettez les étiquettes <DataGrid.RowStyle> autour du Style vous obtenez ce problème. Ce qui est bizarre, c'est que ça a marché pendant un moment comme ça. Ici, c'est le mauvais code.

 <DataGrid Name="DicsountScheduleItemsDataGrid"
                  Grid.Column="0"
                  Grid.Row="2"
                  AutoGenerateColumns="false"
                  ItemsSource="{Binding DiscountScheduleItems, Mode=OneWay}">
            <Style TargetType="DataGridRow">
                <Setter Property="IsSelected"
                        Value="{Binding IsSelected, Mode=TwoWay}" />
            </Style>

et le bon

 <DataGrid Name="DicsountScheduleItemsDataGrid"
                  Grid.Column="0"
                  Grid.Row="2"
                  AutoGenerateColumns="false"
                  ItemsSource="{Binding DiscountScheduleItems, Mode=OneWay}">
            <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Setter Property="IsSelected"
                        Value="{Binding IsSelected, Mode=TwoWay}" />
            </Style>
            </DataGrid.RowStyle>
3
répondu PatFromCanada 2012-09-14 18:26:55

j'ai eu cette erreur quand j'ai essayé d'appliquer des menus de contexte à mon TreeView . Ces essais ont abouti dans un mauvais XAML qui a compilé en quelque sorte:

<TreeView Height="Auto" MinHeight="100"  ItemsSource="{Binding Path=TreeNodes, Mode=TwoWay}" 
    ContextMenu="{Binding Converter={StaticResource ContextMenuConverter}}">
    ContextMenu="">
    <TreeView.ItemContainerStyle>
    ...  

Note la problématique de la ligne: ContextMenu=""> .

Je ne sais pas pourquoi il a compilé, mais j'ai pensé que ça valait la peine d'être mentionné comme une raison pour ce message cryptique d'exception. Comme dit Armentage, regardez attentivement autour du XAML, surtout dans les endroits que vous avez récemment édités.

2
répondu Noich 2011-08-22 07:34:03

j'ai eu la même erreur. Le problème était ce symbole supplémentaire " > " ajouté par erreur entre les balises et < / ComboBox>:

<ComboBox 
   ItemsSource="{Binding StatusTypes}"
   DisplayMemberPath="StatusName"
   SelectedValuePath="StatusID">
   <ComboBox.SelectedValue>
      <Binding Path="StatusID"/>
   </ComboBox.SelectedValue>
   >
</ComboBox>

et voici le code correct:

<ComboBox 
   ItemsSource="{Binding StatusTypes}"
   DisplayMemberPath="StatusName"
   SelectedValuePath="StatusID">
   <ComboBox.SelectedValue>
      <Binding Path="StatusID"/>
   </ComboBox.SelectedValue>
</ComboBox>
2
répondu Vladimir Trifonov 2013-08-10 19:18:38

peut-être pas une réponse aussi utile, mais j'ai eu le même problème en changeant l'ordre des colonnes et j'ai fait une erreur comme celle de l'échantillon suivant. Ayant beaucoup de colonnes, je les ai réorganisées et d'une façon ou d'une autre collé une après fermeture étiquette /DataGrid.Columns :

       <DataGridTemplateColumn x:Name="addedDateColumn" Header="Added Date" Width="SizeToHeader">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=AddedDate}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
            <DataGridTemplateColumn x:Name="rowguidColumn" Header="rowguid" Width="SizeToHeader">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=rowguid}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
    </DataGrid>

de toute façon, perdu une demi-heure à cause de cela. Espérons que cela aide les autres.

1
répondu Andrei Floroiu 2011-03-31 19:42:53

attention aux fautes de frappe! J'ai eu le suivant

<TreeView ItemsSource="{Binding MyCollection}">
    <TreeView.Resources>
        ...
    </TreeView.Resouces>>
</TreeView>

(Notez le tailing > , qui est interprété comme contenu, donc vous mettez deux fois le contenu... Ça m'a pris du temps:)

-1
répondu ElGauchooo 2014-02-10 15:54:38