2011-01-08 19 views
7

Tengo una colección observable vinculada a ItemsControl.VisualCollection arrojando una excepción fuera de rango, vinculada a la colección Observable

Cuando agrego elementos a la colección obtengo una excepción de índice fuera de rango de la colección 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> 

El interior de ChildWindows es la colección en la que estoy agregando elementos. Una de las cosas que destaca es que ChildWindows es una ReadOnlyObservableCollection, la estoy agregando a través de un método que tiene acceso a la Colección en la que se basa.

Tengo una pérdida total de por qué esto está sucediendo (y solo algunas veces).

edición: aquí es el seguimiento de pila real

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

¿Cuántos artículos hay en la colección? –

+0

Me sucede lo mismo. Trataré de publicar aquí si encuentro una solución. – SergioL

+0

También tuve este problema, en una CompositeCollection estática que contenía una colección observable y algunos elementos estáticos. Pude deshacerme del error al establecer el atributo x: Shared de CompositeCollection en "False", pero me gustaría saber cuál es la respuesta correcta y real a esta pregunta. Parece casi un error. – BTownTKD

Respuesta

-1

tuve un problema similar, me tomó meses para averiguar la causa, pero se encontró que ^^ Comprobar this site, especialmente si se modifica la lista de otro hilo. Parece que tienes una condición de carrera, ¡puede ser que este sea el mismo!

+0

Enlinea las respuestas. El enlace ya no es válido – CristianDonosoC

+0

Bueno, era un artículo de 5 partes muy largo, difícil de alinear ... –

2

que tenían el mismo problema y mi comprensión de la misma
(créditos a https://stackoverflow.com/users/249723/vivien-ruiz para el enlace)
es simplemente que son "obligados" a tener problemas si se modifica un ObservableCollection que participa en una unión ItemSource. Descubrí que insertar en el índice 0 "resuelve" mi problema, pero aún podría fallar.
No debe modificarse porque no es una clase segura para subprocesos.
Una mejor solución es actuar en una copia de la lista y asignar la copia a la colección delimitada una vez que se completa la operación.
Por ejemplo: ObservableCollection<ListViewItem> newList = new ObservableCollection<ListViewItem>(mCurrentList); ... ListViewItem item = new ListViewItem(); item.Content = image; newList.Add(item); ... mPictures = newList;

Cuestiones relacionadas