2011-01-08 14 views
7

Quindi ho associato una collection osservabile a ItemsControl.VisualCollection eccezione di lancio fuori intervallo, associata alla collezione Observable

Quando aggiungo elementi alla raccolta ottengo un'eccezione di indice fuori intervallo dalla raccolta Visual.

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

Il ChildWindows interno è la raccolta a cui aggiungere elementi. Si pensi alla nota che ChildWindows è un ReadOnlyObservableCollection, sto aggiungendo tramite un metodo che ha accesso alla Collezione su cui è basato.

Sono a una perdita totale perché questo sta accadendo (e solo alcune volte).

edit: qui è la traccia attuale dello stack

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

quanti oggetti ci sono nella collezione? –

+0

Mi è successa la stessa cosa. Cercherò di postare qui se trovo una soluzione. – SergioL

+0

Avevo anche questo problema, in una CompositeCollection statica che conteneva una raccolta osservabile e alcuni elementi statici. Sono stato in grado di eliminare l'errore impostando l'attributo x: Shared di CompositeCollection su "False", ma mi piacerebbe molto sapere quale sia la vera risposta corretta a questa domanda. Sembra quasi un insetto. – BTownTKD

risposta

-1

Ho avuto un problema simile, mi ha portato mesi per scoprire la causa, ma trovò ^^ Controllare this site, soprattutto se si modifica la lista da un altro thread. Sembra che tu abbia una condizione di gara, potrebbe essere lo stesso!

+0

Inline le risposte. Il link non è più valido – CristianDonosoC

+0

Beh, era un articolo molto lungo di 5 parti, difficile da allineare ... –

2

Ho avuto lo stesso problema e la mia comprensione di esso
(crediti per https://stackoverflow.com/users/249723/vivien-ruiz per il link)
è semplicemente che si sono "vincolati" per avere problemi se si modifica un ObservableCollection che prende parte ad un'ItemSource vincolante. Ho scoperto che l'inserimento nell'indice 0 "risolve" il mio problema, ma potrebbe comunque bloccarsi.
Non dovrebbe essere modificato perché non è una classe thread-safe.
Una soluzione migliore è quella di agire su una copia dell'elenco e assegnare la copia alla raccolta limitata una volta completata l'operazione.
Ad esempio: ObservableCollection<ListViewItem> newList = new ObservableCollection<ListViewItem>(mCurrentList); ... ListViewItem item = new ListViewItem(); item.Content = image; newList.Add(item); ... mPictures = newList;

Problemi correlati