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

139

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

Изображение 699

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

Exception

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

Мой код & hellip;

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.

Теги:
entity-framework
wpf
binding

15 ответов

101
Лучший ответ

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

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

[ContentPropertyAttribute("Items")]

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

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

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

Отсутствует тег <ListView.View>.

  • 4
    Этот ответ правильный. Но прежде чем проверять этот случай, убедитесь, что ваш xaml правильный, как указано в других ответах. В противном случае вы можете потратить много времени на просмотр ItemSource и т. Д., Но в конечном итоге обнаружите, что это вызвано небольшой опечаткой.
155

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

<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>
  • 7
    Вау, это решило мою проблему, большое спасибо.
  • 3
    +1 от меня. Решает и мою проблему :-)
Показать ещё 5 комментариев
47

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

   <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>! < применяется к встроенной коллекции Items. Когда DataContext был позже установлен, мгновенная crashola. Поэтому при отладке этой проблемы обратите внимание не только на ошибки, связанные с конкретными детьми данных ItemsControl.

  • 3
    То же самое случилось со мной: Extra > => Exception
  • 6
    Конечно, это не только>, что сделает это. любые случайно набранные персонажи сами становятся предметами. Вы можете проверить это условие, временно удалив свой атрибут ItemsSource. Если у вас все еще есть строки в сетке данных, вам нужно проверить наличие посторонних символов
Показать ещё 8 комментариев
36

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

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

Теперь, когда вы заканчиваете отсутствующий тег Control.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>
  • 2
    То же самое касается <ListView> , в котором отсутствует <ListView.ItemTemplate> или <ListBox> отсутствует <ListBox.ItemTemplate> .
  • 0
    Почему WPF так чертовски неочевиден? Установка DataTemplate для ListBox вызвала забавные исключения, но ни одно из них не привело к правильному направлению.
Показать ещё 1 комментарий
18

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

<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>
  • 0
    Вот Это Да! вы сделали мой день!
  • 0
    Это то, что исправило мою проблему!
11

Исключение

Элемент коллекции должен быть пустым перед использованием 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, другие объекты (Grid, Button,...) не могут быть добавлены в исходный код. Однако, если ItemsSource не используется, следующий код разрешен:

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

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

  • 2
    Что-то в том, что вы сказали здесь, побудило меня внимательно взглянуть на столбцы моей сетки данных ... потом я понял, что их нет в теге datagrid.columns. +1 за то, что дал мне умственную пробежку.
9

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

Эта ошибка:

Нет родителя (или неправильного родителя) для дочернего элемента ItemsPanelTemplate node

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

Работа:

<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="1" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    ...    
</ItemsControl>
  • 0
    Это. Отсутствовал <DataGrid.Columns> и имел столбцы шаблонов непосредственно внутри <DataGrid> . Странная ошибка для этого.
4

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

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

  • 0
    Ты человек! Это был случай для меня.
4

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

и все хорошо.

3

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

Новое:

<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>
  • 0
    Я должен поблагодарить вас 4 часа, время, которое я потратил, пытаясь исправить этот беспорядок ... СПАСИБО
2

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

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

Моя была с стилем 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>
2

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

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

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

1

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

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

-1

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

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

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

  • 0
    Арментаж уже упоминал об этом, объясняя немного подробнее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню