"Koleksi item harus kosong sebelum menggunakan ItemsSource."

172

Saya mencoba membuat gambar untuk ditampilkan di WPF ListView yang ditata seperti WrapPanel seperti yang dijelaskan dalam artikel Tim Avalon ATC lama ini: Cara Membuat Tampilan Kustom .

Ketika saya mencoba untuk mengisi kumpulan ListView dengan LINQ-to-Entities koleksi objek ADO.NET Entity Framework yang saya dapatkan, saya mendapatkan pengecualian berikut:

Pengecualian

Pengumpulan item harus kosong sebelum menggunakan ItemsSource.

Kode saya ...

Dasar visual

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>

Saya meletakkan breakpoint pada baris itu. ListViewImages.ItemsSourceadalah Nothingsebelum tugas LINQ.

Zack Peterson
sumber

Jawaban:

127

Alasan pengecualian khusus ini dilemparkan adalah karena konten elemen diterapkan ke koleksi Item ListView. Jadi XAML menginisialisasi ListView dengan satu lokal: ImageView dalam koleksi Item-nya. Tetapi ketika menggunakan ItemsControl Anda harus menggunakan properti Items atau properti ItemsSource, Anda tidak bisa menggunakan keduanya secara bersamaan. Karenanya ketika atribut ItemsSource diproses, sebuah pengecualian dilemparkan.

Anda bisa mengetahui properti mana yang akan diterapkan oleh elemen dengan mencari ContentPropertyAttribute di kelas. Dalam hal ini, ini didefinisikan lebih tinggi dalam hirarki kelas, pada ItemsControl:

[ContentPropertyAttribute("Items")]

Maksudnya di sini adalah bahwa Tampilan ListView diatur ke lokal: ImageView sehingga perbaikannya adalah untuk secara eksplisit menunjukkan properti yang akan ditetapkan.

Perbaiki XAML dan pengecualian hilang:

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

<ListView.View>Tag itu tidak ada .

Dave
sumber
6
Jawaban ini benar. Tetapi sebelum memeriksa kasus ini, periksa apakah xaml Anda sudah benar seperti yang disebutkan dalam jawaban lain. Kalau tidak, Anda dapat menghabiskan banyak waktu melihat ItemSource dll hanya untuk akhirnya menemukan bahwa itu disebabkan oleh kesalahan ketik kecil.
pjm
182

Saya memiliki kesalahan yang sama untuk sementara waktu dalam skenario yang sedikit berbeda. Saya punya

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

yang saya perbaiki

<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>
kenwarner
sumber
15
Terima kasih! Masalah yang sangat sederhana ... tapi kesalahan yang membingungkan.
Scott
15
Bagi saya perbedaannya hanya dengan <DataGrid.Columns> (dan saya bahkan tidak menggunakan wpftoolkit).
Dave
1
Saya juga melewatkan <DataGrid.Columns>.
Eternal21
67

Saya baru saja menemukan contoh yang SANGAT berbahaya dari masalah ini. Fragmen asli saya jauh lebih kompleks, yang membuatnya sulit untuk melihat kesalahannya.

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

Serangga? Ekstra > setelah pembukaan awal<ItemsControl> tag ! Yang <diterapkan pada koleksi Item bawaan. Ketika DataContext kemudian diatur, crashola instan. Jadi lihatlah lebih dari sekedar kesalahan yang mengelilingi anak-anak data spesifik ItemsControl Anda ketika men-debug masalah ini.

Armentage
sumber
4
Hal yang sama terjadi pada saya: Extra >=> Exception
surfen
7
tentu saja bukan hanya itu yang akan melakukan ini. setiap karakter yang diketik secara tidak sengaja akan menjadi item sendiri. Anda dapat memeriksa kondisi ini dengan menghapus sementara atribut ItemsSource Anda. Jika Anda masih memiliki baris di kisi data, maka Anda perlu memeriksa karakter yang tidak tersedia
Simon_Weaver
4
Armentage ... Anda baru saja menyelamatkan saya, saya tidak tahu berapa jam mencari ini !!! Terima kasih banyak untuk memposting ini ... memberikan suara!
John Fairbanks
1
Sangat menarik. Saya tidak yakin mengapa itu bukan kesalahan kompilasi. Itu juga membuat saya!
shawn1874
1
Ya ampun, saya mengalami kesalahan yang sama: Ekstra ">". Bisakah saya membelikanmu bir? Benar-benar kesalahan yang aneh dan betapa sulitnya menemukan tanpa kesalahan kompilasi! Ini menyelamatkan hari saya!
Björn Grossmann
40

Saya juga pada skenario yang berbeda.

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

Sekarang ketika Anda selesai dengan tag Control.ItemTemplate yang hilang , semuanya menjadi 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>
Junior Mayhé
sumber
1
Kenapa WPF harus begitu tidak jelas? Mengatur DataTemplate untuk ListBox menyebabkan pengecualian lucu tetapi tidak satupun dari mereka mengarah ke arah yang benar.
Alois Kraus
Ini diperbaiki untuk saya ketika menggunakan a <ItemsControl>.
RHaguiuda
27

Saya memiliki kesalahan yang sama dalam skenario yang berbeda

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

Solusinya adalah menambahkan ItemsControl.ItemsPaneltag sebelumItemsPanelTemplate

<ItemsControl ItemsSource="{Binding TableList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
ehudbk
sumber
Inilah yang memperbaiki masalah saya!
RDV
14

⚠️ Menyatakan jawabannya secara berbeda ⚠️

💡 Dalam Xaml pastikan tidak ada Node Orangtua yang Hilang atau node yang salah di area yang ditentukan.

Sebagai contoh

Ini Gagal:

Tidak ada orangtua yang tepat untuk simpul anak di bawah ini:ItemsPanelTemplate

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

Ini Bekerja:

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

💡 Ada simpul induk yang benar yang <ItemsControl.ItemsPanel>disediakan ^^^. 💡

GamegaMan
sumber
2
Ini. Hilang <DataGrid.Columns>dan memiliki kolom templat langsung di dalam <DataGrid>. Kesalahan aneh untuk itu.
Andrew Grothe
12

Pengecualian

Pengumpulan item harus kosong sebelum menggunakan ItemsSource.

Pengecualian ini terjadi ketika Anda menambahkan item ke ItemsSource berbagai sumber . Jadi, Pastikan Anda tidak melewatkan tag secara tidak sengaja , salah menempatkan tag, menambahkan tag tambahan, atau salah menulis tag.

<!--Right-->

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


<!--WRONG-->

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

Saat ItemsControl.ItemsSourcesudah diatur melalui Binding, item lain (Kotak, Tombol, ...) tidak dapat ditambahkan ke sumber. Namun saat ItemsSourcesedang tidak digunakan , kode berikut diizinkan :

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

perhatikan bagian yang hilang ItemsSource="{Binding MyItems}".

Bizhan
sumber
2
Sesuatu dalam apa yang Anda katakan di sini mendorong saya untuk melihat dengan susah payah pada kolom kisi data saya ... lalu saya menyadari bahwa itu tidak ada dalam tag datagrid.columns. 1 untuk memberi saya jog mental.
Craig Brett
4

Dalam kasus saya, itu hanya StackPanel tambahan di dalam 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>

Menjadi:

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

dan semuanya baik-baik saja.

Carl
sumber
4

Dalam kasus saya, itu tidak menggunakan DataTemplate untuk ItemsControl.

Tua:

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

Baru:

<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>
samiz
sumber
Saya harus berterima kasih 4 jam, waktu yang saya habiskan untuk memperbaiki kekacauan ini ... Terima kasih
Mark
4

Milik saya dengan Gaya datagrid. Jika Anda meninggalkan <DataGrid.RowStyle>tag di sekitar Style Anda mendapatkan masalah itu. Anehnya itu bekerja untuk sementara waktu seperti itu. Ini kode yang salah.

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

dan yang baik

 <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>
PatFromCanada
sumber
3

Saya memiliki kesalahan yang sama. Masalahnya adalah simbol tambahan ini ">" ditambahkan oleh kesalahan antara tag </ComboBox.SelectedValue> dan </ComboBox>:

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

dan ini adalah kode yang benar:

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

Saya mengalami kesalahan ini ketika mencoba menerapkan menu konteks ke menu saya TreeView. Percobaan itu berakhir dengan XAML buruk yang dikompilasi entah bagaimana:

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

Perhatikan baris bermasalah: ContextMenu="">.
Saya tidak tahu mengapa itu dikompilasi, tapi saya pikir itu layak disebut sebagai alasan untuk pesan pengecualian samar ini. Seperti yang dikatakan Armentage, lihat sekeliling XAML dengan hati-hati, terutama di tempat yang baru saja diedit.

Noich
sumber
2

Saya menemukan kesalahan ini di situasi lain. Saya mencoba untuk mendefinisikan gaya untuk TreeViewItems langsung di dalam <TreeView>, tetapi seharusnya tertanam di dalamnya <TreeView.ItemContainerStyle>.

Salah:

<TreeView ItemsSource="{Binding ExampleListView}">
    <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
        <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
    </Style>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding SubItemListList}">
        ...
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Benar:

<TreeView ItemsSource="{Binding ExampleListView}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding SubItemListList}">
        ...
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
RonnyR
sumber
1

Mungkin bukan jawaban yang bermanfaat, tetapi saya memiliki masalah yang sama ketika mengubah urutan kolom dan membuat kesalahan seperti pada contoh berikut. Memiliki banyak kolom, saya memesan ulang dan entah bagaimana menempel satu setelah tag penutup /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>

Bagaimanapun, kehilangan setengah jam karena ini. Semoga ini bisa membantu orang lain.

Andrei Floroiu
sumber
1

Saya mengalami masalah ini karena satu level tag, <ListView.View>lebih spesifik, tidak ada di XAML saya.

Kode ini menghasilkan kesalahan ini.

<Grid>
    <ListView Margin="10" Name="lvDataBinding" >
        <GridView>
            <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
            <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
            <GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
        </GridView>
    </ListView>
</Grid>

Berikut ini memperbaikinya

<Grid>
    <ListView Margin="10" Name="lvDataBinding" >
        <ListView.View> <!-- This was missing in top! -->
            <GridView>
                <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
                <GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
zar
sumber
-1

Waspadalah terhadap kesalahan ketik! Saya memiliki yang berikut ini

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

(Perhatikan tailing > , yang ditafsirkan sebagai konten, jadi Anda menyetel konten dua kali ... Butuh waktu sebentar :)

ElGauchooo
sumber
Armentage sudah menyebutkan ini, dengan sedikit penjelasan.
Ben Voigt