.net - tutorial - mvc entity framework español




"La colección de elementos debe estar vacía antes de usar ItemsSource". (10)

Excepción

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

Esta excepción se produce cuando agrega elementos a ItemsSource través de diferentes fuentes . Por lo tanto, asegúrese de no haber perdido una etiqueta accidentalmente, haber perdido una etiqueta, haber agregado etiquetas adicionales o haber 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.ItemsSource ya está configurado mediante ItemsControl.ItemsSource , otros elementos (Cuadrícula, Botón, ...) no se pueden agregar a la fuente. Sin embargo, mientras ItemsSource no está en uso , se permite el siguiente código:

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

observe la ItemsSource="{Binding MyItems}" faltante ItemsSource="{Binding MyItems}" .

Intento que las imágenes se muestren en un WPF ListView con el estilo de un WrapPanel como se describe en este artículo antiguo de ATV Avalon Team: Cómo crear una vista personalizada .

Cuando trato de llenar el ListView con una colección consultada LINQ-to-Entities de los objetos ADO.NET Entity Framework obtengo la siguiente excepción:

Excepción

La colección de elementos 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 interrupción en esa línea. ListViewImages.ItemsSource es Nothing antes de la asignación de LINQ.


¡Cuidado con los errores tipográficos! Tenía lo siguiente

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

(Observe el seguimiento > , que se interpreta como contenido, por lo que está configurando el doble del contenido ... Me tomó un tiempo :)


El motivo por el que se lanza esta excepción particular es que el contenido del elemento se aplica a la colección Elementos de ListView. Por lo tanto, el XAML inicializa el ListView con un solo local: ImageView en su colección Items. Pero cuando se utiliza un control de elementos, debe usar la propiedad Elementos o la propiedad ItemsSource, no puede usar ambos al mismo tiempo. Por lo tanto, cuando se procesa el atributo ItemsSource se lanza una excepción.

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

[ContentPropertyAttribute("Items")]

La intención aquí era que la Vista de ListView se establezca en un local: ImageView, por lo que la solución es indicar explícitamente la propiedad que se va a 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 etiqueta <ListView.View> .


En mi caso, no estaba usando 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>


Me encontré con 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? ¡La etiqueta adicional > después de la apertura inicial <ItemsControl> ! El < se aplicó a la colección de Elementos incorporada. Cuando el DataContext se configuró más tarde, crashola instantáneo. Por lo tanto, tenga cuidado con algo más que los errores que rodean a sus elementos. Controle los datos específicos de los niños al depurar este problema.


Tal vez 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. Al tener muchas columnas, las reordené 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.


Tuve este error cuando traté de 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>
    ...  

Tenga en cuenta la línea problemática: ContextMenu=""> .
No sé por qué compiló, pero pensé que vale la pena mencionar como una razón para este mensaje de excepción críptico. Como dijo Armentage, mira atentamente el XAML, especialmente en los lugares que editaste recientemente.


Tuve este mismo error por un tiempo en un escenario ligeramente diferente. tuve

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

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 completa con la etiqueta faltante Control.ItemTemplate , todo se vuelve 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>




binding