"La raccolta degli articoli deve essere vuota prima di utilizzare ItemsSource."


172

Sto cercando di far visualizzare le immagini in un ListView di WPF in stile WrapPanel come descritto in questo vecchio articolo del Team ATC Avalon: Come creare una visualizzazione personalizzata .

Quando provo a popolare ListView con una raccolta interrogata LINQ-to-Entities di oggetti ADO.NET Entity Framework ottengo la seguente eccezione:

Eccezione

La raccolta degli articoli deve essere vuota prima di utilizzare ItemsSource.

Il mio codice ...

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>

Ho messo un punto di interruzione su quella linea. ListViewImages.ItemsSourceè Nothingappena prima dell'assegnazione LINQ.

Risposte:


127

Il motivo per cui viene generata questa particolare eccezione è che il contenuto dell'elemento viene applicato alla raccolta Articoli di ListView. Quindi XAML inizializza ListView con un singolo locale: ImageView nella sua collezione Items. Ma quando si utilizza un ItemsControl è necessario utilizzare la proprietà Items o ItemsSource, non è possibile utilizzare entrambi contemporaneamente. Pertanto, quando l'attributo ItemsSource viene elaborato, viene generata un'eccezione.

Puoi scoprire a quale proprietà verrà applicato il contenuto di un elemento cercando ContentPropertyAttribute sulla classe. In questo caso è definito più in alto nella gerarchia di classi, su ItemsControl:

[ContentPropertyAttribute("Items")]

L'intenzione qui era che ListView's View fosse impostato su local: ImageView, quindi la correzione è di indicare esplicitamente la proprietà da impostare.

Correggi XAML e l'eccezione scompare:

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

Manca quello <ListView.View> tag.


6
Questa risposta è corretta Ma prima di verificare questo caso, controlla che il tuo xaml sia corretto, come indicato in altre risposte. Altrimenti puoi passare molto tempo a guardare ItemSource ecc. Solo per scoprire che è causato da un piccolo errore di battitura.
pjm

182

Ho avuto lo stesso errore per un po 'in uno scenario leggermente diverso. avevo

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

che ho fissato per essere

<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>

15
Grazie! Un problema così semplice ... ma un errore così confuso.
Scott,

15
Per me la differenza mancava semplicemente di <DataGrid.Columns> (e non stavo nemmeno usando wpftoolkit).
Dave,

1
Manca <DataGrid.Columns> anche per me.
Eternal21,

67

Ho appena incontrato un esempio MOLTO insidioso di questo problema. Il mio frammento originale era molto più complesso, il che rendeva difficile vedere l'errore.

   <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>

Il bug? Il extra > dopo il <ItemsControl>tag di apertura iniziale ! Il <Got applicata alla collezione built-in Articoli. Quando il DataContext è stato successivamente impostato, crashola istantaneo. Quindi cerca più di semplici errori che circondano i tuoi figli di dati specifici di ItemsControl durante il debug di questo problema.


4
Lo stesso è successo a me: Extra >=> Eccezione
surfen,

7
ovviamente non è solo> che lo farà. i caratteri digitati accidentalmente diventeranno oggetti da soli. puoi verificare questa condizione eliminando temporaneamente l'attributo ItemsSource. Se nella griglia dei dati sono ancora presenti righe, è necessario verificare la presenza di caratteri estranei
Simon_Weaver,

4
Armentage ... mi hai appena salvato, non so quante ore di ricerca di questo !!! Grazie mille per aver pubblicato questo ... votando!
John Fairbanks,

1
Molto interessante. Non sono sicuro del perché questo non sia un errore di compilazione. Anche a me!
shawn1874,

1
Oh mio Dio, ho avuto lo stesso errore: Extra ">". Posso offrirti una birra? Che strano errore e quanto difficile da trovare senza un errore di compilazione! Questo mi ha salvato la giornata!
Björn Grossmann,

40

Anch'io su uno scenario diverso.

<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>

Ora quando completi con il tag mancante Control.ItemTemplate , tutto torna alla normalità:

<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>

1
Perché WPF deve essere così dannatamente invisibile? L'impostazione di DataTemplate per un ListBox ha causato eccezioni divertenti, ma nessuna di esse ha portato alla giusta direzione.
Alois Kraus,

Questo mi è stato risolto quando ho usato a <ItemsControl>.
RHaguiuda,

27

Ho avuto questo stesso errore in uno scenario diverso

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

La soluzione era aggiungere il ItemsControl.ItemsPaneltag prima diItemsPanelTemplate

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

Questo è ciò che ha risolto il mio problema!
RDV,

14

⚠️ Dichiarare la risposta in modo diverso ⚠️

💡 In Xaml verificare che non vi siano nodi padre mancanti o nodi errati nelle aree definite.

Per esempio

Questo non riesce:

Non esiste un genitore appropriato per il ItemsPanelTemplatenodo figlio di seguito:

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

Questo funziona:

<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
    <ItemsControl.ItemsPanel> <!-- I am the missing parent! -->
        <ItemsPanelTemplate>
            <UniformGrid Rows="1" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    ...    
</ItemsControl>

💡 Esiste un nodo genitore appropriato di <ItemsControl.ItemsPanel>^^^ fornito. 💡


2
Questo. Mancava <DataGrid.Columns>e aveva colonne modello direttamente all'interno <DataGrid>. Strano errore per quello.
Andrew Grothe,

12

Eccezione

La raccolta degli articoli deve essere vuota prima di utilizzare ItemsSource.

Questa eccezione si verifica quando si aggiungono elementi alle ItemsSource diverse origini . Quindi assicurati di non aver perso accidentalmente un tag, di averlo smarrito, di aver aggiunto tag aggiuntivi o di aver sbagliato a scrivere un tag.

<!--Right-->

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


<!--WRONG-->

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

Mentre ItemsControl.ItemsSourceè già impostato Binding, altri elementi (Griglia, Pulsante, ...) non possono essere aggiunti alla fonte. Tuttavia, mentre nonItemsSource è in uso , è consentito il seguente codice :

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

notare la ItemsSource="{Binding MyItems}"parte mancante .


2
Qualcosa in quello che hai detto qui mi ha spinto a dare una lunga occhiata alle colonne della mia griglia di dati ... poi ho capito che non erano in un tag datagrid.columns. +1 per avermi dato la corsa mentale.
Craig Brett,


4

Nel mio caso, era solo un StackPanel extra all'interno di 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>

diventa:

<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>

e tutto va bene.


4

Nel mio caso, non stava usando un DataTemplate per ItemsControl.

Vecchio:

<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>

Nuovo:

<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>

Dovrei ringraziarti per 4 ore, il tempo che ho trascorso cercando di risolvere questo pasticcio ... GRAZIE
Marco

4

Il mio era con uno stile datagrid. Se si omettono i <DataGrid.RowStyle>tag attorno allo stile, si ottiene questo problema. La cosa strana è che ha funzionato per un po 'così. Ecco il cattivo codice.

 <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>

e il buono

 <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

Ho avuto lo stesso errore. Il problema era questo simbolo aggiuntivo ">" aggiunto per errore tra i tag </ComboBox.SelectedValue> e </ComboBox>:

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

ed ecco il codice corretto:

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

2

Ho avuto questo errore quando ho provato ad applicare i menu di scelta rapida al mio TreeView. Quei tentativi sono finiti in un XAML male che è stato compilato in qualche modo:

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

Si noti la linea di problematica: ContextMenu="">.
Non so perché sia ​​stato compilato, ma ho pensato che valesse la pena menzionarlo come motivo di questo criptico messaggio di eccezione. Come ha detto Armentage, guardati intorno alla XAML con attenzione, specialmente nei luoghi che hai modificato di recente.


2

Ho riscontrato questo errore in un'altra situazione. Ho provato a definire uno stile per TreeViewItems direttamente all'interno di <TreeView>, ma invece avrei dovuto incorporarlo all'interno <TreeView.ItemContainerStyle>.

Sbagliato:

<TreeView ItemsSource="{Binding ExampleListView}">
    <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
        <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
    </Style>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding SubItemListList}">
        ...
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Corretta:

<TreeView ItemsSource="{Binding ExampleListView}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding SubItemListList}">
        ...
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

1

Forse non una risposta così utile, ma ho avuto lo stesso problema quando ho cambiato l'ordine delle colonne e ho commesso un errore come quello nel seguente esempio. Avendo molte colonne, le ho riordinate e in qualche modo incollate una dopo aver chiuso il tag /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>

Comunque, ho perso mezz'ora per questo. Spero che questo aiuti gli altri.


1

Ho riscontrato questo problema perché un livello di tag, <ListView.View> riscontrato nel mio XAML mancava per essere specifici.

Questo codice ha prodotto questo errore.

<Grid>
    <ListView Margin="10" Name="lvDataBinding" >
        <GridView>
            <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
            <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
            <GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
        </GridView>
    </ListView>
</Grid>

Ciò che segue è stato risolto

<Grid>
    <ListView Margin="10" Name="lvDataBinding" >
        <ListView.View> <!-- This was missing in top! -->
            <GridView>
                <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
                <GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

-1

Attenzione ai refusi! Ho avuto il seguente

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

(Nota la coda > , che viene interpretata come contenuto, quindi stai impostando il doppio del contenuto ... Mi ci è voluto un po ':)


Armentage ne ha già parlato, con qualche spiegazione in più.
Ben Voigt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.