"La colección de artículos debe estar vacía antes de usar ItemsSource".


172

Estoy tratando de hacer que las imágenes se muestren en un WPF ListView con el estilo de un WrapPanel como se describe en este antiguo artículo del Equipo ATC Avalon: Cómo crear una vista personalizada .

Cuando intento completar ListView con una colección consultada de LINQ-to-Entities de objetos de ADO.NET Entity Framework, obtengo la siguiente excepción:

Excepción

La colección de artículos debe estar vacía antes de usar ItemsSource.

Mi código…

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>

Puse un punto de quiebre en esa línea. ListViewImages.ItemsSourcees Nothingjusto antes de la asignación de LINQ.

Respuestas:


127

La razón por la que se genera esta excepción en particular es porque el contenido del elemento se aplica a la colección de elementos de ListView. Entonces, el XAML inicializa el ListView con un único local: ImageView en su colección de Artículos. Pero cuando use un ItemsControl debe usar la propiedad Items o la propiedad ItemsSource, no puede usar ambos al mismo tiempo. Por lo tanto, cuando se procesa el atributo ItemsSource, se genera una excepción.

Puede averiguar a qué propiedad se aplicará el contenido de un elemento buscando ContentPropertyAttribute en la clase. En este caso, se define más arriba en la jerarquía de clases, en ItemsControl:

[ContentPropertyAttribute("Items")]

La intención aquí era que la Vista de ListView se estableciera en un local: ImageView, por lo que la solución es indicar explícitamente la propiedad que se establecerá.

Arregle el XAML y la excepción desaparece:

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

Faltaba esa <ListView.View>etiqueta.


66
Esta respuesta es correcta. Pero antes de verificar este caso, verifique que su xaml sea correcto como se menciona en otras respuestas. De lo contrario, puede pasar mucho tiempo mirando ItemSource, etc., solo para descubrir que finalmente es causado por un pequeño error tipográfico.
pjm

182

Tuve este mismo error por un tiempo en un escenario ligeramente diferente. yo tenía

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

que arreglé para ser

<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
¡Gracias! Un problema tan simple ... pero un error tan confuso.
Scott

15
Para mí, la diferencia simplemente faltaba <DataGrid.Columns> (y ni siquiera estaba usando el wpftoolkit).
Dave

1
Falta el <DataGrid.Columns> para mí también.
Eternal21

67

Acabo de encontrar un ejemplo MUY insidioso de este problema. Mi fragmento original era mucho más complejo, lo que dificultaba ver el error.

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

¿El bicho? El extra > después de la <ItemsControl>etiqueta de apertura inicial ! Se <aplicó a la colección de elementos incorporados. Cuando más tarde se configuró el DataContext, crashola instantánea. Por lo tanto, busque más que solo errores alrededor de los elementos secundarios de datos específicos de ItemsControl al depurar este problema.


44
Me pasó lo mismo: Extra >=> Excepción
surfen

77
por supuesto, no es solo eso lo que hará esto. los caracteres escritos accidentalmente se convertirán en elementos por sí mismos. puede verificar esta condición eliminando temporalmente su atributo ItemsSource. Si todavía tiene filas en la cuadrícula de datos, entonces debe verificar si hay caracteres extraños
Simon_Weaver

44
Armentage ... me acabas de salvar No sé cuántas horas de buscar esto !!! Muchas gracias por publicar esto ... ¡votando!
John Fairbanks

1
Muy interesante. No estoy seguro de por qué eso no es un error de compilación. ¡También me atrapó!
shawn1874

1
Oh, tuve el mismo error: Extra ">". ¿Puedo comprarte una cerveza? ¡Qué extraño error y qué difícil de encontrar sin un error de compilación! Esto me salvó el día!
Björn Grossmann

40

Yo también en un escenario diferente.

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

Ahora, cuando complete con la etiqueta que falta Control.ItemTemplate , todo se normaliza:

<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
¿Por qué debe ser WPF tan obvio? Configurar DataTemplate para un ListBox causó excepciones divertidas, pero ninguna de ellas conducía a la dirección correcta.
Alois Kraus

Esto me solucionó al usar a <ItemsControl>.
RHaguiuda

27

Tuve este mismo error en un escenario diferente

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

La solución fue agregar la ItemsControl.ItemsPaneletiqueta antes deItemsPanelTemplate

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

¡Esto es lo que solucionó mi problema!
RDV

14

⚠️ Para decir la respuesta de manera diferente ⚠️

X En Xaml, verifique que no haya nodos primarios faltantes o nodos incorrectos en las áreas definidas.

Por ejemplo

Esto está fallando:

No hay un padre adecuado para el ItemsPanelTemplatenodo hijo a continuación:

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

Esto esta funcionando:

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

💡 Hay un nodo padre apropiado de <ItemsControl.ItemsPanel>proporcionado ^^^. 💡


2
Esta. Faltaba <DataGrid.Columns>y tenía columnas de plantilla directamente dentro <DataGrid>. Error extraño para eso.
Andrew Grothe

12

Excepción

La colección de artículos debe estar vacía antes de usar ItemsSource.

Esta excepción ocurre cuando agrega elementos a ItemsSource través de diferentes fuentes . Por lo tanto, asegúrese de no haberse perdido accidentalmente una etiqueta, haber perdido una etiqueta, agregado etiquetas adicionales o haya escrito mal una etiqueta.

<!--Right-->

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


<!--WRONG-->

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

Mientras ItemsControl.ItemsSourceya está configurado Binding, otros elementos (Cuadrícula, Botón, ...) no se pueden agregar a la fuente. Sin embargo, mientras noItemsSource esté en uso , se permite el siguiente código :

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

Observe la ItemsSource="{Binding MyItems}"parte que falta .


2
Algo en lo que dijiste aquí me llevó a analizar detenidamente mis columnas de cuadrícula de datos ... luego me di cuenta de que no estaban en una etiqueta datagrid.columns. +1 por darme el trote mental.
Craig Brett


4

En mi caso, era solo un StackPanel adicional dentro de 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>

Se convierte en:

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

y todo esta bien


4

En mi caso, no estaba usando un DataTemplate para ItemsControl.

Antiguo:

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

Nuevo:

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

Debería agradecerte 4 horas, el tiempo que he pasado tratando de arreglar este desastre ... GRACIAS
Mark

4

La mía tenía un estilo de cuadrícula de datos. Si deja de lado las <DataGrid.RowStyle>etiquetas alrededor del estilo, obtendrá ese problema. Lo extraño es que funcionó durante un tiempo así. Aquí está el mal código.

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

y lo bueno

 <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

Yo tenía el mismo error. El problema fue este símbolo adicional ">" agregado por error entre las etiquetas </ComboBox.SelectedValue> y </ComboBox>:

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

y aquí está el código correcto:

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

2

He tenido este error cuando intenté aplicar menús contextuales a mi TreeView. Esos intentos terminaron en un XAML malo que se compiló de alguna manera:

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

Observe la línea problemática: ContextMenu="">.
No sé por qué se compiló, pero pensé que vale la pena mencionarlo como una razón para este mensaje críptico de excepción. Como dijo Armentage, mire el XAML cuidadosamente, especialmente en los lugares que ha editado recientemente.


2

Encontré este error en otra situación. Traté de definir un estilo para TreeViewItems directamente dentro de <TreeView>, pero debería haberlo incrustado dentro<TreeView.ItemContainerStyle> .

Incorrecto:

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

Correcto:

<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

Quizás no sea una respuesta tan útil, pero tuve el mismo problema al cambiar el orden de las columnas y cometí un error como el de la siguiente muestra. Teniendo muchas columnas, las volví a ordenar y de alguna manera pegué una después de cerrar la etiqueta /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 todos modos, perdí media hora debido a esto. Espero que esto ayude a otros.


1

Me encontré con este problema porque un nivel de etiqueta, <ListView.View> faltaba para ser específico, en mi XAML.

Este código produjo este error.

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

Lo siguiente lo arregló

<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

¡Cuidado con los errores tipográficos! Tuve lo siguiente

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

(Tenga en cuenta la cola > , que se interpreta como contenido, por lo que está configurando dos veces el contenido ... Me tomó un tiempo :)


Armentage ya mencionó esto, con un poco más de explicación.
Ben Voigt
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.