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

когда я пытаюсь заполнить 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 с помощью одного локального: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>тег! Элемент<применяется к коллекции встроенных элементов. Когда 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>(обратите внимание на хвостовых >, который интерпретируется как контент, поэтому вы устанавливаете вдвое больше контента... Заняло у меня некоторое время:)
Comments