it-swarm.com.de

Msgstr "Die Itemsammlung muss leer sein, bevor ItemsSource verwendet werden kann."

Ich versuche, Bilder in einer WPF-Listenansicht anzuzeigen, die wie ein WrapPanel gestaltet ist, wie in diesem alten Artikel des ATC Avalon-Teams beschrieben: So erstellen Sie eine benutzerdefinierte Ansicht .

WPF ListView WrapPanel Images

Wenn ich versuche, die ListView mit einer von LINQ-to-Entities abgefragten Auflistung von ADO.NET Entity Framework-Objekten zu füllen, wird die folgende Ausnahme angezeigt:

Ausnahme

Die Elementsammlung muss leer sein, bevor ItemsSource verwendet werden kann.

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

Ich habe einen Haltepunkt in diese Zeile eingefügt. ListViewImages.ItemsSource ist Nothing kurz vor der LINQ-Zuweisung.

159
Zack Peterson

Der Grund, warum diese spezielle Ausnahme ausgelöst wird, besteht darin, dass der Inhalt des Elements auf die Items-Auflistung von ListView angewendet wird. Daher initialisiert die XAML die ListView mit einem einzelnen local: ImageView in ihrer Items-Auflistung. Wenn Sie ein ItemsControl verwenden, müssen Sie entweder die Items-Eigenschaft oder die ItemsSource-Eigenschaft verwenden. Sie können jedoch nicht beide gleichzeitig verwenden. Daher wird beim Verarbeiten des ItemsSource-Attributs eine Ausnahme ausgelöst.

Sie können herausfinden, auf welche Eigenschaft der Inhalt eines Elements angewendet wird, indem Sie das ContentPropertyAttribute für die Klasse suchen. In diesem Fall ist defined in der Klassenhierarchie auf dem ItemsControl höher:

[ContentPropertyAttribute("Items")]

Die Absicht hierbei war, dass die ListView-Ansicht auf eine lokale: ImageView festgelegt wird, sodass der Fix die festzulegende Eigenschaft explizit angibt.

Korrigieren Sie die XAML und die Ausnahme verschwindet:

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

Es hat gefehlt, dass <ListView.View> Etikett.

118
Dave

Ich hatte den gleichen Fehler für eine Weile in einem etwas anderen Szenario. ich hatte

<wpftoolkit:DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding Path=Accounts}" >
    <wpftoolkit:DataGridTextColumn 
        Header="Account Name" 
        Binding="{Binding Path=AccountName}" />
</wpftoolkit:DataGrid>

was ich festgelegt habe zu sein

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

Ich bin gerade auf ein SEHR heimtückisches Beispiel für dieses Problem gestoßen. Mein ursprüngliches Fragment war viel komplexer, was es schwierig machte, den Fehler zu erkennen.

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

Der Käfer? Das Extra > nach dem ersten Öffnen <ItemsControl> Etikett! Das < wurde auf die integrierte Items-Sammlung angewendet. Wenn der Datenkontext später festgelegt wurde, wird sofort eine Absturzmeldung angezeigt. Achten Sie beim Debuggen dieses Problems auf mehr als nur Fehler, die Ihre ItemsControl-spezifischen untergeordneten Daten betreffen.

64
Armentage

Ich auch in einem anderen Szenario.

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

Wenn Sie nun das fehlende Tag Control.ItemTemplate eingeben, wird alles 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>
39
Junior M

Ich hatte den gleichen Fehler in einem anderen Szenario

<ItemsControl ItemsSource="{Binding TableList}">
    <ItemsPanelTemplate>
        <WrapPanel Orientation="Horizontal"/>
    </ItemsPanelTemplate>
</ItemsControl>

Die Lösung bestand darin, das ItemsControl.ItemsPanel-Tag vor dem ItemsPanelTemplate

<ItemsControl ItemsSource="{Binding TableList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
25
ehudbk

Ausnahme

Die Elementsammlung muss leer sein, bevor ItemsSource verwendet werden kann.

Diese Ausnahme tritt auf, wenn Sie dem ItemsSource über verschiedene Quellen Elemente hinzufügen. Stellen Sie also sicher, dass Sie nicht versehentlich ein Tag verpasst, ein Tag verlegt, zusätzliche Tags hinzugefügt oder ein Tag falsch geschrieben haben.

<!--Right-->

<ItemsControl ItemsSource="{Binding MyItems}">
     <ItemsControl.ItemsPanel.../>
     <ItemsControl.MyAttachedProperty.../>
     <FrameworkElement.ActualWidth.../>
</ItemsControl>


<!--WRONG-->

<ItemsControl ItemsSource="{Binding MyItems}">
     <Grid.../>
     <Button.../>
     <DataTemplate.../>
     <Heigth.../>
</ItemsControl>

Während ItemsControl.ItemsSource ist bereits durch Binding festgelegt, andere Elemente (Raster, Schaltfläche, ...) können der Quelle nicht hinzugefügt werden. Während ItemsSource nicht in Gebrauch ist ist der folgende Code erlaubt:

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

bemerke das fehlende ItemsSource="{Binding MyItems}" Teil.

12
Bizhan

Um die Antwort anders zu formulieren; Überprüfen Sie, ob keine fehlenden übergeordneten Knoten oder falschen Knoten vorhanden sind .

Dies ist fehlgeschlagen:

Kein übergeordnetes Element (oder falsches übergeordnetes Element) für den untergeordneten Knoten ItemsPanelTemplate

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

Das hat funktioniert:

<ItemsControl ItemsSource="{Binding TimeSpanChoices}">
    <ItemsControl.ItemsPanel> <!-- I am the missing parent! -->
        <ItemsPanelTemplate>
            <UniformGrid Rows="1" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    ...    
</ItemsControl>
11
ΩmegaMan

Belassen Sie die Vorlagenspalte in DataGrid.Columns. Dies hat mir geholfen, das Problem zu beheben.

Ref: DataGridTemplateColumn: Die Items-Auflistung muss leer sein, bevor ItemsSource verwendet werden kann.

5
Ram

In meinem Fall wurde kein DataTemplate für das ItemsControl verwendet.

Alt:

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

Neu:

<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

Meins war mit einem datagrid Stil. Wenn Sie die <DataGrid.RowStyle> - Tags um den Style herum weglassen, tritt dieses Problem auf. Seltsam ist, dass es eine Weile so funktioniert hat. Hier ist der schlechte 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>

und das gute

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

In meinem Fall war es nur ein zusätzliches StackPanel in der 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>

Wird:

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

und alles ist gut.

4
Carl

Ich hatte den gleichen fehler Das Problem war, dass dieses zusätzliche Symbol ">" versehentlich zwischen den Tags </ComboBox.SelectedValue> und </ ComboBox> eingefügt wurde:

<ComboBox 
   ItemsSource="{Binding StatusTypes}"
   DisplayMemberPath="StatusName"
   SelectedValuePath="StatusID">
   <ComboBox.SelectedValue>
      <Binding Path="StatusID"/>
   </ComboBox.SelectedValue>
   >
</ComboBox>

und hier ist der richtige Code:

<ComboBox 
   ItemsSource="{Binding StatusTypes}"
   DisplayMemberPath="StatusName"
   SelectedValuePath="StatusID">
   <ComboBox.SelectedValue>
      <Binding Path="StatusID"/>
   </ComboBox.SelectedValue>
</ComboBox>
3

Ich hatte diesen Fehler, als ich versuchte, Kontextmenüs auf mein TreeView anzuwenden. Diese Versuche endeten in einer schlechten XAML, die irgendwie kompiliert wurde:

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

Beachten Sie die problematische Zeile: ContextMenu="">.
Ich weiß nicht, warum es kompiliert wurde, aber ich dachte, es ist erwähnenswert, als Grund für diese kryptische Ausnahmebedingungsnachricht genannt zu werden. Schauen Sie sich, wie Armentage sagte, die XAML sorgfältig durch, insbesondere an Stellen, die Sie kürzlich bearbeitet haben.

2
Noich

Vielleicht keine so nützliche Antwort, aber ich hatte das gleiche Problem beim Ändern der Spaltenreihenfolge und machte einen Fehler wie im folgenden Beispiel. Da ich viele Spalten habe, habe ich sie neu angeordnet und irgendwie eine eingefügt, nachdem ich das Tag /DataGrid.Columns Geschlossen habe:

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

Sowieso verlor eine halbe Stunde wegen diesem. Hoffe das hilft anderen.

1
Andrei Floroiu