2011-01-08 20 views
7

से जुड़ा हुआ है इसलिए मुझे एक अवलोकन संग्रह एक आइटम नियंत्रण में बंधे हैं।विज़ुअलकोलेक्शन रेंज अपवाद से बाहर फेंक रहा है, अवलोकन संग्रह

जब मैं संग्रह में आइटम जोड़ता हूं तो मुझे विजुअल संग्रह से श्रेणी के बाहर सूचकांक का अपवाद मिलता है।

<ItemsControl x:Name="ReportPages" ItemsSource="{Binding History}" DockPanel.Dock="Top"> 
    <ItemsControl.Template> 
     <ControlTemplate TargetType="ItemsControl"> 
      <ItemsPresenter HorizontalAlignment="Center"/> 
     </ControlTemplate> 
    </ItemsControl.Template> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ItemsControl ItemsSource="{Binding ChildWindows}"> 
       <ItemsControl.Template> 
        <ControlTemplate TargetType="ItemsControl"> 
         <Grid Margin="0,10,0,10" > 
          <ItemsPresenter /> 
          <Border x:Name="ResizeFrame" BorderThickness="4" BorderBrush="LightBlue" Visibility="{Binding Active, Converter={StaticResource BooleanToVisibilityConverter}}"/> 
         </Grid> 
        </ControlTemplate> 
       </ItemsControl.Template> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <Canvas x:Name="LayoutCanvas" Background="white" ClipToBounds="true" 
        MouseDown="History_MouseLeftButtonDown" PreviewMouseDown="ClosePanels" 
        Width="{Binding PageSizeProp.PageWidth}" Height="{Binding PageSizeProp.PageHeight}"/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
      </ItemsControl> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

आंतरिक चाइल्डविंडोज़ वह संग्रह है जिसमें मैं आइटम जोड़ रहा हूं। नोट के बारे में एक विचार यह है कि चाइल्डविंडोज़ एक ReadOnlyObservableCollection है, मैं एक ऐसे विधि के माध्यम से जोड़ रहा हूं जिस पर संग्रह पर पहुंच है।

मैं ऐसा क्यों कर रहा हूं (और केवल कुछ बार) के लिए कुल नुकसान में हूं।

संपादित करें: यहाँ वास्तविक स्टैक ट्रेस

at System.Windows.Media.VisualCollection.Insert(Int32 index, Visual visual) 
    at System.Windows.Controls.Panel.addChildren(GeneratorPosition pos, Int32 itemCount) 
    at System.Windows.Controls.Panel.OnItemsChangedInternal(Object sender, ItemsChangedEventArgs args) 
    at System.Windows.Controls.Panel.OnItemsChanged(Object sender, ItemsChangedEventArgs args) 
    at System.Windows.Controls.ItemContainerGenerator.OnItemAdded(Object item, Int32 index) 
    at System.Windows.Controls.ItemContainerGenerator.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) 
    at System.Windows.Controls.ItemContainerGenerator.System.Windows.IWeakEventListener.ReceiveWeakEvent(Type managerType, Object sender, EventArgs e) 
    at System.Windows.WeakEventManager.DeliverEventToList(Object sender, EventArgs args, ListenerList list) 
    at System.Windows.WeakEventManager.DeliverEvent(Object sender, EventArgs args) 
    at System.Collections.Specialized.CollectionChangedEventManager.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) 
    at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e) 
    at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args) 
    at System.Windows.Controls.ItemCollection.System.Windows.IWeakEventListener.ReceiveWeakEvent(Type managerType, Object sender, EventArgs e) 
    at System.Windows.WeakEventManager.DeliverEventToList(Object sender, EventArgs args, ListenerList list) 
    at System.Windows.WeakEventManager.DeliverEvent(Object sender, EventArgs args) 
    at System.Collections.Specialized.CollectionChangedEventManager.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) 
    at System.Windows.Data.CollectionView.OnCollectionChanged(NotifyCollectionChangedEventArgs args) 
    at System.Windows.Data.ListCollectionView.ProcessCollectionChangedWithAdjustedIndex(NotifyCollectionChangedEventArgs args, Int32 adjustedOldIndex, Int32 adjustedNewIndex) 
    at System.Windows.Data.ListCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args) 
    at System.Windows.Data.CollectionView.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args) 
    at System.Collections.ObjectModel.ReadOnlyObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs args) 
    at System.Collections.ObjectModel.ReadOnlyObservableCollection`1.HandleCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) 
    at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e) 
    at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    at System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T item) 
    at System.Collections.ObjectModel.Collection`1.Add(T item) 
    at CalManv4UI.DataHistoryReportPageBase.AddNewChart(ChildWindowSaved cws, Boolean activate) in C:\Users\Joel Barsotti\Documents\Visual Studio 2010\Projects\CalMAN V4\CalMANv4-WPF\CalManv4UI\Workflow\DataHistoryReportPageBase.cs:line 72 
+0

संग्रह में कितने आइटम हैं? –

+0

मुझे वही बात हो रही है। अगर मुझे कोई समाधान मिल जाए तो मैं यहां पोस्ट करने की कोशिश करूंगा। – SergioL

+0

मुझे यह समस्या भी एक स्थिर कंपोजिट कोलेक्शन में थी जिसमें एक अवलोकन संग्रह और कुछ स्थैतिक आइटम शामिल थे। मैं कंपोजिट कोलेक्शन का एक्स सेट करके त्रुटि से छुटकारा पाने में सक्षम था: "गलत" पर साझा विशेषता, लेकिन मुझे यह जानना बहुत अच्छा लगेगा कि इस सवाल का वास्तविक, सही उत्तर क्या है। लगभग एक बग की तरह लगता है। – BTownTKD

उत्तर

-1

मैं एक ऐसी ही समस्या थी है, मुझे कारण पता लगाने के लिए महीने लग गए, लेकिन पाया यह ^^ चेक this site, खासकर यदि आप सूची को संशोधित एक और धागे से। आपको दौड़ की स्थिति लगती है, हो सकता है कि यह वही हो!

+0

उत्तर इनलाइन करें। लिंक अब मान्य नहीं है – CristianDonosoC

+0

अच्छा, यह एक 5 हिस्सा बहुत लंबा लेख था, इनलाइन करना मुश्किल था ... –

2

मैं एक ही समस्या है और (लिंक के लिए https://stackoverflow.com/users/249723/vivien-ruiz को क्रेडिट) यह
की मेरी समझ
बस है कि आप "बाध्य" समस्याओं के लिए अगर आप एक ObservableCollection जो एक ItemSource बंधन में भाग लेता है संशोधित किया था। मैंने पाया कि इंडेक्स 0 पर डालने से मेरी समस्या हल हो जाती है, लेकिन यह अभी भी दुर्घटनाग्रस्त हो सकती है।
इसे संशोधित नहीं किया जाना चाहिए क्योंकि यह थ्रेड-सुरक्षित वर्ग नहीं है।
एक बेहतर समाधान सूची की प्रतिलिपि पर कार्य करना है और ऑपरेशन पूरा हो जाने के बाद प्रतिलिपि कोलेसीशन में कॉपी असाइन करना है।
उदाहरण के लिए: ObservableCollection<ListViewItem> newList = new ObservableCollection<ListViewItem>(mCurrentList); ... ListViewItem item = new ListViewItem(); item.Content = image; newList.Add(item); ... mPictures = newList;

संबंधित मुद्दे