“ItemsSource'u kullanmadan önce öğe koleksiyonu boş olmalıdır.”


172

Bu eski ATC Avalon Ekibi makalesinde açıklandığı gibi bir WrapPanel tarzında bir WPF ListView görüntülemek için görüntü almaya çalışıyorum: Nasıl Özel Görünüm Oluşturma .

ListView ADO.NET Entity Framework nesneleri bir LINQ-to Entities sorgulanmış koleksiyonu ile doldurmaya çalıştığımda, aşağıdaki özel durum olsun:

İstisna

ItemsSource'u kullanmadan önce öğe koleksiyonu boş olmalıdır.

Kodum…

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>

Bu çizgiye bir kesme noktası koydum. ListViewImages.ItemsSourceolduğu Nothinghemen LINQ göreve kadar.

Yanıtlar:


127

Bu özel durumun atılmasının nedeni, öğenin içeriğinin ListView Öğeleri koleksiyonuna uygulanmasıdır. Böylece XAML, Öğeler koleksiyonunda ListView'i tek bir local: ImageView ile başlatır. Ancak ItemsControl kullanırken, Items özelliğini veya ItemsSource özelliğini kullanmalısınız, her ikisini aynı anda kullanamazsınız. Böylece ItemsSource özniteliği işlendiğinde bir istisna atılır.

Sınıfta ContentPropertyAttribute öğesini arayarak bir öğenin içeriğinin hangi özelliğe uygulanacağını öğrenebilirsiniz. Bu durumda , sınıf hiyerarşisinde, ItemsControl üzerinde daha yüksek tanımlanır :

[ContentPropertyAttribute("Items")]

Buradaki amaç, ListView'ın Görünümünün bir local: ImageView olarak ayarlanmasıydı, böylece düzeltme, ayarlanacak özelliği açıkça belirtmektir.

XAML'yi düzeltin ve istisna ortadan kalkar:

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

Bu <ListView.View>etiket eksikti .


6
Bu cevap doğrudur. Ancak bu durumu kontrol etmeden önce, xaml'inizin diğer cevaplarda belirtildiği gibi doğru olduğunu kontrol edin. Aksi takdirde, ancak sonunda küçük bir yazım hatası neden olduğunu bulmak için ItemSource'ın vb bakarak çok zaman harcayabilirsiniz.
pjm

182

Aynı hatayı biraz farklı bir senaryoda yaşadım. sahiptim

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

ki bunu sabitledim

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

15
Teşekkür ederim! Böyle basit bir sorun ... ama kafa karıştırıcı bir hata.
Scott

15
Benim için fark sadece <DataGrid.Columns> eksikti (ve wpftoolkit bile kullanmıyordum).
Dave

1
Benim için de <DataGrid.Columns> eksik.
Ebedi21

67

Ben sadece bu sorunun ÇOK sinsi bir örnek karşılaştım. Orijinal parçam çok daha karmaşıktı, bu da hatayı görmeyi zorlaştırdı.

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

Böcek? Ekstra > ilk açılış <ItemsControl>etiketinden sonra ! <Got Öğeler yerleşik koleksiyonunda başvurmuştur. DataContext daha sonra ayarlandığında, anında crashola. Bu nedenle, bu hata ayıklama sırasında ItemsControl'e özgü veri çocuklarınızı çevreleyen hatalardan daha fazlasını arayın.


4
Aynı şey benim için de oldu: Extra >=> Exception
surfen

7
Tabii ki sadece bunu yapmaz. yanlışlıkla yazılan karakterler kendiliğinden öğe haline gelecektir. ItemsSource özniteliğinizi geçici olarak silerek bu durumu kontrol edebilirsiniz. Veri ızgarasında hala satırlarınız varsa, yabancı karakterleri kontrol etmeniz gerekir
Simon_Weaver

4
Ermenistan ... beni kurtardın, kaç saat aradığını bilmiyorum !!! Bunu gönderdiğin için çok teşekkürler ... oy ver!
John Fairbanks

1
Çok ilginç. Bunun neden derleme hatası olmadığından emin değilim. Beni de yakaladı!
shawn1874

1
Ah benim, aynı hatayla karşılaştım: Ekstra ">". Sana bira alabilir miyim? Ne garip bir hata ve derleme hatası olmadan bulmak ne kadar zor! Bu benim günümü kurtardı!
Björn Grossmann

40

Ben de farklı bir senaryoda.

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

Şimdi eksik olan Control.ItemTemplate etiketini tamamladığınızda , her şey normale döner :

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

1
WPF neden bu kadar açık değil? Bir liste kutusu için DataTemplate ayarlamak komik özel durumlara neden oldu, ancak hiçbiri doğru yöne yol açmadı.
Alois Kraus

Bu a <ItemsControl>.
RHaguiuda

27

Aynı hatayı farklı bir senaryoda yaşadım

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

Çözüm, ItemsControl.ItemsPaneletiketiItemsPanelTemplate

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

Bu benim sorunumu çözdü!
RDV

14

⚠️ Cevabı farklı ifade etmek için ⚠️

💡 XAML olduğunu doğrulamak bir eksik Ana Düğüm veya yanlış düğümler belirli bölgelerde.

Örneğin

Bu Başarısız:

Aşağıdaki alt düğüm için uygun bir ebeveyn yoktur ItemsPanelTemplate:

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

İşe yarıyor:

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

Provided Sağlanan uygun bir ana düğüm var <ItemsControl.ItemsPanel>^ ^ ^. 💡


2
Bu. Eksikti <DataGrid.Columns>ve içinde doğrudan şablon sütunları vardı <DataGrid>. Bunun için garip bir hata.
Andrew Grothe

12

İstisna

ItemsSource'u kullanmadan önce öğe koleksiyonu boş olmalıdır.

Bu istisna, ItemsSource üzerinden farklı kaynaklara öğe eklediğinizde oluşur . Bu nedenle, yanlışlıkla bir etiketi kaçırmadığınızdan, bir etiketi yanlış yerleştirdiğinizden, fazladan etiket eklemediğinizden veya bir etiketi yanlış yazdığınızdan emin olun .

<!--Right-->

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


<!--WRONG-->

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

ItemsControl.ItemsSourceZaten ayarlanmış olsa da Binding, kaynağa diğer öğeler (Izgara, Düğme, ...) eklenemez. Ancak süre ItemsSourceolduğu kullanımdaki değil şu kod edilir izin :

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

eksik ItemsSource="{Binding MyItems}"kısmı fark et .


2
Burada söylediğin bir şey veri ızgara sütunlarıma uzun bir bakış atmamı istedi ... sonra bir datagrid.columns etiketinde olmadığını fark ettim. +1 bana zihinsel dürtüyü verdiğin için.
Craig Brett


4

Benim durumumda, ListView içinde sadece ekstra bir StackPanel oldu:

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

Oluyor:

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

ve her şey yolunda.


4

Benim durumumda, ItemsControl için bir DataTemplate kullanmıyordu.

Eski:

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

Yeni:

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

Sana 4 saat teşekkür etmeliyim, bu pisliği gidermek için harcadığım zaman ... TEŞEKKÜR EDERİZ
Mark

4

Benimki veri ızgarası stilindeydi. <DataGrid.RowStyle>Etiketleri Stil'in dışında bırakırsanız bu sorunu yaşarsınız. Garip bir şey böyle bir süre çalıştı. İşte kötü kod.

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

ve iyi

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

3

Aynı hatayla karşılaştım. Sorun, </ComboBox.SelectedValue> ve </ComboBox> etiketleri arasına yanlışlıkla eklenen bu ">" sembolü oldu:

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

ve işte doğru kod:

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

2

Bu duruma bağlam menüleri uygulamayı denediğimde yaşadım TreeView. Bu denemeler bir şekilde derlenen kötü bir XAML ile sonuçlandı:

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

Sorunlu çizgiyi Not: ContextMenu="">.
Neden derlendiğini bilmiyorum, ama bu şifreli istisna mesajının bir nedeni olarak bahsetmeye değer olduğunu düşündüm. Armentage'ın dediği gibi, özellikle yakın zamanda düzenlediğiniz yerlerde XAML'ye dikkatlice bakın.


2

Başka bir durumda bu hatayla karşılaştım. Doğrudan içinde TreeViewItems için bir stil tanımlamaya çalıştı <TreeView>, ancak bunun yerine içinde gömülü olması gerekir <TreeView.ItemContainerStyle>.

Yanlış:

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

Doğru:

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

1

Belki de böyle yararlı bir cevap değil, ama sütun sırasını değiştirirken aynı sorunu vardı ve aşağıdaki örnekte olduğu gibi hata yaptım. Çok fazla sütun var, onları yeniden sıraladım ve etiketi kapattıktan sonra bir şekilde yapıştırdım /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>

Her neyse, bu yüzden yarım saat kaybettim. Umarım bu başkalarına yardımcı olur.


1

Bu soruna rastladım çünkü <ListView.View>XAML'imde bir seviye etiket eksikti.

Bu kod bu hatayı verdi.

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

Aşağıdaki düzeltti

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

-1

Yazım hatalarına dikkat edin! Aşağıdakilere sahiptim

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

( İçerik olarak yorumlanan kuyruklama > öğesine dikkat edin , bu yüzden içeriğin iki katı ayarlıyorsunuz ... Bana biraz zaman aldı :)


Ermenistan bundan daha önce bahsetmişti, biraz daha açıklama ile.
Ben Voigt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.