Ошибка: «Элемент коллекции должен быть пустым перед использованием ItemsSource.» [Дубликат]

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

149
задан Grant Winney 24 July 2014 в 18:39
поделиться

15 ответов

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

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

[ContentPropertyAttribute("Items")]

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

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

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

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

110
ответ дан Zack Peterson 19 August 2018 в 19:53
поделиться
  • 1
    Этот ответ правильный. Но прежде чем проверять этот случай, проверьте, правильно ли ваш xaml указан в других ответах. В противном случае вы можете потратить много времени, глядя на ItemSource и т. Д., Чтобы в конечном итоге обнаружить, что это вызвано небольшой опечаткой. – pjm 21 November 2016 в 13:31

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

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

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

52
ответ дан Ben Voigt 19 August 2018 в 19:53
поделиться
  • 1
    То же самое случилось со мной: Extra > = & gt; исключение – surfen 11 December 2011 в 03:51
  • 2
    конечно, это не просто & gt; это сделает это. любые случайно введенные символы станут самими статьями. вы можете проверить это условие, временно удалив атрибут ItemsSource. Если у вас все еще есть строки в сетке данных, вам необходимо проверить посторонние символы – Simon_Weaver 17 July 2012 в 04:10
  • 3
    Арментаж ... ты только что спас меня. Я не знаю, сколько часов нужно искать! Большое спасибо за публикацию этого ... голосования вверх! – John 3 August 2014 в 23:23
  • 4
    Благодаря! Уже собирался отказаться от этого ... – Cyral 7 February 2015 в 20:34
  • 5
    Очень интересно. Я не уверен, почему это не ошибка компиляции. Это тоже меня! – shawn1874 19 March 2015 в 17:02

Исключение

Элемент коллекции должен быть пуст перед использованием 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}".

12
ответ дан Bizhan 19 August 2018 в 19:53
поделиться
  • 1
    Что-то в том, что вы сказали здесь, побудило меня долго смотреть на мои столбцы сетки данных ... тогда я понял, что они не находятся в теге datagrid.columns. +1 за то, что дал мне умственный пробег. – Craig Brett 2 April 2017 в 00:00

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

и все в порядке.

4
ответ дан Carl 19 August 2018 в 19:53
поделиться

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

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

5
ответ дан Community 19 August 2018 в 19:53
поделиться

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

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

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

-1
ответ дан ElGauchooo 19 August 2018 в 19:53
поделиться
  • 1
    Арментаж уже упомянул об этом, с чуть более подробным объяснением. – Ben Voigt 10 October 2014 в 01:48

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

<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>
37
ответ дан Junior M 19 August 2018 в 19:53
поделиться
  • 1
    То же самое происходит с отсутствующим <ListView> отсутствием <ListView.ItemTemplate> или <ListBox> отсутствующим <ListBox.ItemTemplate>. – Grant Winney 24 July 2014 в 18:54
  • 2
    Почему WPF такой чертовски неочевиден? Установка DataTemplate для ListBox вызывала забавные исключения, но ни один из них не приводил к правильному направлению. – Alois Kraus 21 August 2014 в 20:31
  • 3
    Это исправлено для меня при использовании функции <ItemsControl>. – RHaguiuda 16 February 2017 в 11:16

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

<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>
162
ответ дан kenwarner 19 August 2018 в 19:53
поделиться
  • 1
    Вау, это решило мою проблему, спасибо большое. – Pragmateek 19 October 2009 в 10:27
  • 2
    +1 от меня. Решает также мою проблему :-) – Gabriel Magana 24 November 2009 в 23:45
  • 3
    Спасибо! Такая простая проблема ... но такая запутанная ошибка. – Scott 2 February 2010 в 21:54
  • 4
    То же самое для меня, спасибо – Max Lambertini 17 December 2012 в 17:01
  • 5
    Для меня разница просто отсутствовала в & lt; DataGrid.Columns & gt; (и я даже не использовал wpftoolkit). – Dave 13 March 2013 в 10:55

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

<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>
21
ответ дан Massimiliano Kraus 19 August 2018 в 19:53
поделиться

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

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

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

2
ответ дан Noich 19 August 2018 в 19:53
поделиться

Мое было с Datagrid Style. Если вы оставите теги <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>

и good

 <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
ответ дан PatFromCanada 19 August 2018 в 19:53
поделиться

В моем случае он не использовал DataTemplate для ItemsControl.

Old:

<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>
4
ответ дан samiz 19 August 2018 в 19:53
поделиться
  • 1
    Я должен поблагодарить вас 4 часа, время, которое я потратил, пытаясь исправить этот беспорядок ... СПАСИБО – Mark 17 April 2018 в 18:10

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

<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
ответ дан Vladimir Trifonov 19 August 2018 в 19:53
поделиться

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

This Failed:

Нет родителя (или неправильного родителя) для дочернего узла 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>
10
ответ дан ΩmegaMan 19 August 2018 в 19:53
поделиться
  • 1
    Эта. Отсутствовал <DataGrid.Columns> и имел столбцы шаблонов непосредственно внутри <DataGrid>. Нечетная ошибка для этого. – Andrew Grothe 12 July 2016 в 12:44
Другие вопросы по тегам:

Похожие вопросы: