"Коллекция элементов должна быть пустой перед использованием ItemsSource."

Я пытаюсь получить изображения для отображения в WPF ListView в стиле WrapPanel, как описано в этой старой статье команды ATC Avalon:как создать пользовательский вид.

WPF ListView WrapPanel Images

когда я пытаюсь заполнить ListView с помощью LINQ-to-Entities запрошенной коллекции ADO.NET объекты Entity Framework я получаю следующее исключение:

исключение

коллекция элементов должна быть пуста до с помощью Что ItemsSource.

мой код...

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>

Я поставил точку останова на этой строке. ListViewImages.ItemsSource и Nothing непосредственно перед назначением LINQ.

15 ответов


причина, по которой возникает это конкретное исключение, заключается в том, что содержимое элемента применяется к коллекции элементов ListView. Таким образом, XAML инициализирует ListView одним local:ImageView в своей коллекции элементов. Но при использовании ItemsControl необходимо использовать либо Items свойство или ItemsSource свойство, нельзя использовать оба одновременно. Следовательно, при обработке атрибута ItemsSource возникает исключение.

вы можете узнать, какие свойство содержимое элемента будет применяться для поиска ContentPropertyAttribute в классе. В этом случае это определена выше в иерархии классов, на ItemsControl:

[ContentPropertyAttribute("Items")]

намерение здесь состояло в том, чтобы представление ListView было установлено на local:ImageView, поэтому исправление должно явно указать свойство, которое будет установлено.

исправьте XAML, и исключение исчезнет:

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

этого не хватало <ListView.View> метка.


у меня была такая же ошибка некоторое время в немного другом сценарии. У меня было

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

который я исправил, чтобы быть

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

Я только что столкнулся с очень коварным примером этой проблемы. Мой первоначальный фрагмент был намного сложнее, что затрудняло понимание ошибки.

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

ошибка? Лишние > после первоначального открытия <ItemsControl> тег! The < got применяется к коллекции встроенных элементов. Когда DataContext был позже установлен, instant crashola. Так что следите за больше, чем просто ошибки окружают ваши ItemsControl конкретных дочерних данных при отладке этого проблема.


Я тоже по другому сценарию.

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

теперь, когда вы закончите с отсутствует тег управление.Свойства itemtemplate, все приходит в норму:

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

у меня была такая же ошибка в другой сценарий

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

решение было добавить ItemsControl.ItemsPanel тег перед ItemsPanelTemplate

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

исключение

коллекция элементов должна быть пустой перед использованием ItemsSource.

это исключение возникает при добавлении элементов в ItemsSource через разные источники. Так Убедитесь, что вы случайно пропустил тег, неуместный тег, добавил дополнительные теги или неправильно написал тег.

<!--Right-->

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


<!--WRONG-->

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

пока ItemsControl.ItemsSource уже установлен через Binding, другие элементы (сетка, кнопка,...) не может быть добавлен в источник. Однако пока ItemsSource и не используется следующий код разрешено:

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

обратите внимание на недостающие ItemsSource="{Binding MyItems}" часть.


чтобы сформулировать ответ по-другому; убедитесь, что есть нет отсутствующих родительских узлов или неправильных узлов.

Это Не Удалось:

нет родителя (или неправильный родитель) для ItemsPanelTemplate дочерний узел

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

Это Работает:

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

сохранить столбец шаблона внутри DataGrid.Столбцы. Это помогло мне решить эту проблему.

Ref:DataGridTemplateColumn: перед использованием ItemsSource коллекция элементов должна быть пустой.


в моем случае это была просто дополнительная StackPanel внутри 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>

будет:

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

и все хорошо.


в моем случае он не использовал DataTemplate для 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>

New:

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

мой был со стилем datagrid. Если вы оставите <DataGrid.RowStyle> теги вокруг стиля вы получаете эту проблему. Странно, что это работало какое-то время. Вот плохой код.

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

хорошая

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

у меня была эта ошибка, когда я пытался применить контекстные меню к моему TreeView. Эти попытки закончились плохим XAML, который каким-то образом скомпилирован:

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

обратите внимание на проблемную строку:ContextMenu=""> .
Я не знаю, почему он скомпилирован, но я решил, что это стоит упомянуть как причину этого загадочного сообщения об исключении. Как сказал Арментедж, внимательно осмотрите XAML, особенно в местах, которые вы недавно редактировали.


у меня была такая же ошибка. Проблема заключалась в том, что этот дополнительный символ ">" был добавлен по ошибке между тегами и :

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

и вот правильный код:

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

возможно, не такой полезный ответ, но у меня была та же проблема при изменении порядка столбцов и сделала ошибку, как в следующем примере. Имея много столбцов, я переупорядочил их и как-то вставил один после закрытия тега /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>

во всяком случае, потерял полчаса из-за этого. Надеюсь, это поможет другим.


остерегайтесь опечаток! У меня было следующее

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

(обратите внимание на хвостовых >, который интерпретируется как контент, поэтому вы устанавливаете вдвое больше контента... Заняло у меня некоторое время:)