"आइटम संग्रह, आइटम स्रोत के उपयोग से पहले खाली होना चाहिए।"


172

मैं एक WPF ListView में प्रदर्शित करने के लिए एक WrapPanel की तरह स्टाइल करने की कोशिश कर रहा हूं जैसा कि इस पुराने एटीसी एवलॉन टीम लेख में वर्णित है: कस्टम व्यू कैसे बनाएं

जब मैं ADO.NET इकाई फ्रेमवर्क ऑब्जेक्ट्स के एक लाइन-टू-एंटिटीज के संग्रह के साथ ListView को पॉप्युलेट करने का प्रयास करता हूं, तो मुझे निम्न अपवाद मिलते हैं:

अपवाद

आइटम संग्रह, आइटम स्रोत का उपयोग करने से पहले खाली होना चाहिए।

मेरा कोड…

मूल दृश्य

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 काम से पहले।

जवाबों:


127

इस विशेष अपवाद को फेंकने का कारण यह है कि तत्व की सामग्री सूची दृश्य के आइटम संग्रह पर लागू हो जाती है। तो XAML अपने आइटम संग्रह में एक स्थानीय: ImageView के साथ ListView को आरंभ करता है। लेकिन जब एक ItemControl का उपयोग करते हुए आपको या तो आइटम संपत्ति या आइटम स्रोत का उपयोग करना होगा, तो आप एक ही समय में दोनों का उपयोग नहीं कर सकते। इसलिए जब ItemSource विशेषता संसाधित हो जाती है तो एक अपवाद फेंक दिया जाता है।

आप यह जान सकते हैं कि किस तत्व की सामग्री कक्षा में ContentPropertyAttribute की खोज करके लागू होगी। इस मामले में यह उच्च श्रेणी पदानुक्रम में, उच्च पर परिभाषित किया गया है

[ContentPropertyAttribute("Items")]

यहाँ आशय यह था कि ListView के दृश्य को स्थानीय पर सेट किया जाए: ImageView ताकि फिक्स स्पष्ट रूप से संपत्ति सेट होने का संकेत दे।

XAML को ठीक करें और अपवाद दूर हो जाता है:

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

वह <ListView.View>टैग गायब था ।


6
यह उत्तर सही है। लेकिन इस मामले की जाँच करने से पहले जाँच लें कि आपका xaml अन्य उत्तरों में उल्लिखित सही है या नहीं। अन्यथा आप बहुत समय बिताने के बाद भी ItemSource आदि को देखने के लिए केवल एक छोटे टाइपो के कारण ही पा सकते हैं।
pjm

182

थोड़ी देर के अलग परिदृश्य में मुझे यही त्रुटि थी। मैं था

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

15
धन्यवाद! इतनी सरल समस्या ... लेकिन ऐसी भ्रामक त्रुटि।
स्कॉट

15
मेरे लिए अंतर बस <DataGrid.Columns> याद कर रहा था (और मैं wpftoolkit का उपयोग भी नहीं कर रहा था)।
डेव

1
मेरे लिए भी <DataGrid.Columns> गुम है।
इटरनल

67

मैं सिर्फ इस समस्या का एक बहुत ही कपटी उदाहरण में भाग गया। मेरा मूल टुकड़ा बहुत अधिक जटिल था, जिसने त्रुटि को देखना मुश्किल बना दिया।

   <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 को बाद में सेट किया गया था, तो तत्काल क्रैशोला। तो इस समस्या को डीबग करते समय अपने आइटम्स को विशिष्ट डेटा बच्चों को घेरने से अधिक त्रुटियों के लिए देखें।


4
मेरे साथ भी ऐसा ही हुआ: अतिरिक्त >=> अपवाद
1

7
बेशक, यह सिर्फ ऐसा नहीं है कि ऐसा करेगा। किसी भी गलती से टाइप किए गए अक्षर खुद ही आइटम बन जाएंगे। आप अस्थायी रूप से अपने आइटम्स स्रोत को हटाकर इस स्थिति की जाँच कर सकते हैं। यदि आपके पास अभी भी डेटा ग्रिड में पंक्तियाँ हैं, तो आपको बाहरी पात्रों के लिए जांचने की आवश्यकता है
सिमोन_विवर

4
Armentage ... आपने अभी मुझे बचाया है मुझे नहीं पता कि इस की तलाश कितने घंटे है !!! यह पोस्ट करने के लिए बहुत बहुत धन्यवाद ... मतदान!
जॉन फेयरबैंक्स

1
बहुत ही रोचक। मुझे यकीन नहीं है कि यह एक संकलन त्रुटि क्यों नहीं है। यह मुझे भी मिल गया!
shawn1874

1
ओह माय, मेरे पास एक ही त्रुटि थी: अतिरिक्त ">"। क्या मैं आपको बीयर खरीद सकता हूं? क्या एक अजीब त्रुटि है और एक संकलन त्रुटि के बिना कितना मुश्किल है! इससे मेरा दिन बच गया!
ब्योर्न ग्रॉसमैन

40

मैं भी एक अलग परिदृश्य पर।

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

1
WPF को इतना स्पष्ट क्यों होना चाहिए? DataTemplate को एक ListBox के लिए सेट करना मज़ेदार अपवादों का कारण बनता है, लेकिन उनमें से कोई भी सही दिशा में नहीं जा रहा था।
Alois Kraus

यह मेरे लिए तय है जब एक का उपयोग कर <ItemsControl>
रघुगुड़ा

27

एक अलग परिदृश्य में मेरी यही त्रुटि थी

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

यह मेरा मुद्दा तय हो गया है!
RDV

14

⚠️ उत्तर को अलग तरह से बताने के लिए answer

Ing Xaml में सत्यापित करें कि परिभाषित क्षेत्रों में कोई गुम जनक नोड्स या गलत नोड्स नहीं हैं।

उदाहरण के लिए

यह असफल हो रहा है:

नीचे दिए गए बच्चे के नोड के लिए कोई उचित अभिभावक नहीं है 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>

💡 <ItemsControl.ItemsPanel>^ ^ ^ प्रदान की एक उचित मूल नोड है । 💡


2
यह। गायब <DataGrid.Columns>था और सीधे अंदर टेम्पलेट कॉलम थे <DataGrid>। उसके लिए अजीब त्रुटि।
एंड्रयू ग्रोटे

12

अपवाद

आइटम संग्रह, आइटम स्रोत का उपयोग करने से पहले खाली होना चाहिए।

यह अपवाद तब होता है जब आप 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}"भाग पर ध्यान दें ।


2
आपने यहां जो कुछ कहा है, उससे मुझे अपने डेटा ग्रिड कॉलम पर एक लंबी कड़ी नज़र डालने का संकेत मिला है ... तब मुझे एहसास हुआ कि वे डेटाटग्रिड.कॉम्बियंस टैग में नहीं थे। मुझे मानसिक जोग देने के लिए +1।
क्रेग ब्रेट


4

मेरे मामले में, यह ListView के अंदर सिर्फ एक अतिरिक्त StackPanel था:

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

और सब ठीक है।


4

मेरे मामले में, यह ItemControl के लिए DataTemplate का उपयोग नहीं कर रहा था।

पुराना:

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

नया:

<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 घंटे का समय देना चाहिए, जिस समय को मैंने इस झंझट को ठीक करने में बिताया है ... धन्यवाद
Mark

4

मेरा एक डेटाग्रिड स्टाइल के साथ था। यदि आप <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>

3

मेरी भी यही त्रुटि थी। समस्या यह अतिरिक्त प्रतीक ">" टैग के बीच गलती से जोड़ा गया था </ComboBox.SelectedValue> और </ ComboBox>:

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

2

जब मैं संदर्भ मेनू को अपने पर लागू करने का प्रयास करता हूं तो मुझे यह त्रुटि हुई है TreeView। उन कोशिशों का अंत बुरे XAML में हुआ, जो किसी तरह संकलित हुईं:

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

समस्याग्रस्त रेखा पर ध्यान दें ContextMenu="">:।
मुझे नहीं पता कि यह क्यों संकलित किया गया था, लेकिन मुझे लगा कि यह इस गूढ़ अपवाद संदेश के लिए एक कारण के रूप में उल्लेख के लायक है। जैसे Armentage ने कहा, XAML को ध्यान से देखें, खासकर उन जगहों पर जहाँ आपने हाल ही में संपादित किया है।


2

मुझे एक अन्य स्थिति में इस त्रुटि का सामना करना पड़ा। मैंने सीधे तौर पर ट्री व्यूआईटम्स के लिए एक शैली को परिभाषित करने की कोशिश की <TreeView>, लेकिन इसके बजाय उसे भीतर एम्बेड करना चाहिए था <TreeView.ItemContainerStyle>

गलत:

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

सही बात:

<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

शायद इस तरह के एक उपयोगी जवाब नहीं है, लेकिन कॉलम ऑर्डर बदलते समय मुझे एक ही समस्या थी और निम्नलिखित नमूने में एक की तरह गलती की। बहुत सारे कॉलम होने के बाद, मैंने उन्हें फिर से टाइप किया और किसी तरह टैग बंद करने के बाद चिपका दिया /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>

वैसे भी, इस वजह से आधा घंटा खो दिया। आशा है कि यह दूसरों की मदद करता है।


1

मैं इस समस्या में भाग गया क्योंकि टैग का एक स्तर, <ListView.View>स्पष्ट होने के लिए, मेरे एक्सएएमएल में गायब था।

इस कोड ने यह त्रुटि उत्पन्न की।

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

निम्नलिखित ने इसे ठीक कर दिया

<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

टाइपो से सावधान! मेरे पास निम्नलिखित थे

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

(टेलिंग नोटिस > , जिसकी व्याख्या सामग्री के रूप में की गई है, इसलिए आप दो बार सामग्री सेट कर रहे हैं ... मुझे कुछ समय लगा :)


आर्किटेज ने पहले ही इसका उल्लेख किया है, थोड़ा और स्पष्टीकरण के साथ।
बेन वोइगट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.