"Les éléments de la collection doit être vide avant d'utiliser ItemsSource."
j'essaie d'obtenir des images à afficher dans une ListView WPF coiffée comme un WrapPanel comme décrit dans cet ancien article de L'équipe D'Avalon ATC: comment créer une vue personnalisée .
quand j'essaie de remplir le ListView avec une collection de LINQ-to-Entities ADO.NET Entity Framework objects I get the following exception:
Exception
collection d'Éléments doit être vide avant utiliser ItemsSource.
mon code ...
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>
j'ai mis un point d'arrêt sur cette ligne. ListViewImages.ItemsSource
est Nothing
juste avant L'assignation LINQ.
15 réponses
la raison pour laquelle cette exception particulière est rejetée est que le contenu de l'élément est appliqué à la collection D'Articles de ListView. Ainsi, XAML initialise le ListView avec un seul local:ImageView dans sa collection D'objets. Mais lorsque vous utilisez un ItemsControl vous devez utiliser soit la propriété Items ou la propriété ItemsSource, vous ne pouvez pas utiliser les deux en même temps. Par conséquent, lorsque L'attribut ItemsSource est traité, une exception est lancée.
vous pouvez le découvrir quelle propriété le contenu d'un élément sera appliqué en recherchant la propriété ContentPropertyAttribute sur la classe. Dans ce cas ,c'est défini supérieur dans la hiérarchie de classe, sur le ItemsControl:
[ContentPropertyAttribute("Items")]
l'intention ici était que la vue de ListView soit définie à un local:ImageView de sorte que le correctif indique explicitement la propriété à définir.
"151930920 de" Résoudre le XAML et l'exception disparaît:<ListView Name="ListViewImages"
SelectionMode="Single"
ItemsSource="{Binding}">
<ListView.View>
<local:ImageView />
</ListView.View>
</ListView>
il manquait cette étiquette <ListView.View>
.
j'ai eu cette même erreur pendant un certain temps dans un scénario légèrement différent. J'ai eu
<wpftoolkit:DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding Path=Accounts}" >
<wpftoolkit:DataGridTextColumn
Header="Account Name"
Binding="{Binding Path=AccountName}" />
</wpftoolkit:DataGrid>
que j'ai fixé à être
<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>
je viens de tomber sur un exemple très insidieux de ce problème. Mon fragment d'origine était beaucoup plus complexe, il est difficile de voir l'erreur.
<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>
le bug? Le supplément > après l'ouverture initiale <ItemsControl>
étiquette! Le <
a été appliqué à la collection d'articles intégrés. Quand le DataContext a été plus tard défini, crashola instantanée. Donc, recherchez plus que de simples erreurs autour de vos données spécifiques à ItemsControl. les enfants lors du débogage de ce problème.
moi aussi dans un autre scénario.
<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>
maintenant quand vous remplissez avec la balise manquante contrôle.ItemTemplate , tout redevient normal:
<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>
j'ai eu cette même erreur dans un scénario différent
<ItemsControl ItemsSource="{Binding TableList}">
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl>
la solution était d'ajouter la balise ItemsControl.ItemsPanel
avant la balise ItemsPanelTemplate
<ItemsControl ItemsSource="{Binding TableList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
Exception
collection d'Éléments doit être vide avant d'utiliser ItemsSource.
cette exception se produit lorsque vous ajoutez des articles au ItemsSource
par l'entremise de différentes sources . Si
Assurez-vous que vous n'avez pas accidentellement manqué une étiquette, égaré une étiquette, ajouté des étiquettes supplémentaires, ou mal écrit une étiquette.
<!--Right-->
<ItemsControl ItemsSource="{Binding MyItems}">
<ItemsControl.ItemsPanel.../>
<ItemsControl.MyAttachedProperty.../>
<FrameworkElement.ActualWidth.../>
</ItemsControl>
<!--WRONG-->
<ItemsControl ItemsSource="{Binding MyItems}">
<Grid.../>
<Button.../>
<DataTemplate.../>
<Heigth.../>
</ItemsControl>
alors que ItemsControl.ItemsSource
est déjà défini par Binding
, autres éléments (grille, Bouton, ...) ne peut pas être ajouté à la source.
Toutefois, alors que ItemsSource
est non utilisé le code suivant est autorisé :
<!--Right-->
<ItemsControl>
<Button.../>
<TextBlock.../>
<sys:String.../>
</ItemsControl>
noter la partie manquante ItemsSource="{Binding MyItems}"
.
pour énoncer la réponse différemment; vérifier qu'il n'y a aucun noeud Parent manquant ou noeuds incorrects .
Cet Échec:
pas de parent (ou mauvais parent) pour le ItemsPanelTemplate
nœud enfant
<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
<ItemsPanelTemplate>
<UniformGrid Rows="1" />
</ItemsPanelTemplate>
...
</ItemsControl>
Cela A Fonctionné:
<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
<ItemsControl.ItemsPanel> <!-- I am the missing parent! -->
<ItemsPanelTemplate>
<UniformGrid Rows="1" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
...
</ItemsControl>
conserver la colonne modèle dans DataGrid.Colonne. Cela m'a aidé à résoudre ce problème.
Ref: DataGridTemplateColumn : collection d'Éléments doit être vide avant d'utiliser ItemsSource.
dans mon cas, c'était juste un StackPanel supplémentaire à L'intérieur du 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>
devient:
<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>
et tout va bien.
dans mon cas, il n'utilisait pas de Datemplate pour les 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>
Nouveau:
<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>
Mine était avec un Style datagrid. Si vous omettez les étiquettes <DataGrid.RowStyle>
autour du Style vous obtenez ce problème. Ce qui est bizarre, c'est que ça a marché pendant un moment comme ça. Ici, c'est le mauvais code.
<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>
et le bon
<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>
j'ai eu cette erreur quand j'ai essayé d'appliquer des menus de contexte à mon TreeView
. Ces essais ont abouti dans un mauvais XAML qui a compilé en quelque sorte:
<TreeView Height="Auto" MinHeight="100" ItemsSource="{Binding Path=TreeNodes, Mode=TwoWay}"
ContextMenu="{Binding Converter={StaticResource ContextMenuConverter}}">
ContextMenu="">
<TreeView.ItemContainerStyle>
...
Note la problématique de la ligne: ContextMenu="">
.
Je ne sais pas pourquoi il a compilé, mais j'ai pensé que ça valait la peine d'être mentionné comme une raison pour ce message cryptique d'exception. Comme dit Armentage, regardez attentivement autour du XAML, surtout dans les endroits que vous avez récemment édités.
j'ai eu la même erreur. Le problème était ce symbole supplémentaire " > " ajouté par erreur entre les balises et < / ComboBox>:
<ComboBox
ItemsSource="{Binding StatusTypes}"
DisplayMemberPath="StatusName"
SelectedValuePath="StatusID">
<ComboBox.SelectedValue>
<Binding Path="StatusID"/>
</ComboBox.SelectedValue>
>
</ComboBox>
et voici le code correct:
<ComboBox
ItemsSource="{Binding StatusTypes}"
DisplayMemberPath="StatusName"
SelectedValuePath="StatusID">
<ComboBox.SelectedValue>
<Binding Path="StatusID"/>
</ComboBox.SelectedValue>
</ComboBox>
peut-être pas une réponse aussi utile, mais j'ai eu le même problème en changeant l'ordre des colonnes et j'ai fait une erreur comme celle de l'échantillon suivant. Ayant beaucoup de colonnes, je les ai réorganisées et d'une façon ou d'une autre collé une après fermeture étiquette /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>
de toute façon, perdu une demi-heure à cause de cela. Espérons que cela aide les autres.
attention aux fautes de frappe! J'ai eu le suivant
<TreeView ItemsSource="{Binding MyCollection}">
<TreeView.Resources>
...
</TreeView.Resouces>>
</TreeView>
(Notez le tailing > , qui est interprété comme contenu, donc vous mettez deux fois le contenu... Ça m'a pris du temps:)