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

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

WPF ListView WrapPanel Images

Когда я пытаюсь заполнить 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.

Ответ 1

Причиной этого исключения является то, что содержимое элемента применяется к коллекции элементов 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>.

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Исключение

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

Ответ 7

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

Эта ошибка:

Нет родителя (или неправильного родителя) для дочернего элемента 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>

Ответ 8

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

и все хорошо.

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

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

Ответ 13

У меня была такая же ошибка. Проблема заключалась в дополнительном символе " > ", добавленном по ошибке между тегами </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>

Ответ 14

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

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

Ответ 15

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

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

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