2011-01-08 13 views
7

Więc mam kolekcję obserwowalną powiązaną z ItemsControl.Wizualne wychwytywanie poza zakresem wyjątku, powiązane z kolekcją Observable

Po dodaniu elementów do kolekcji otrzymuję wyjątek od wskaźnika poza zakresem kolekcji 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> 

Wewnętrzny system ChildWindows jest kolekcją, do której dodajemy elementy. Należy pamiętać, że ChildWindows jest ReadOnlyObservableCollection, dodam za pomocą metody, która ma dostęp do kolekcji, na której jest oparta.

Mam całkowitą stratę za to, dlaczego tak się dzieje (i tylko kilka razy).

edit: tutaj jest rzeczywisty ślad stosu

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

Ile artykułów jest w kolekcji? –

+0

To samo dzieje się ze mną. Postaram się opublikować tutaj, jeśli znajdę rozwiązanie. – SergioL

+0

Miałem również ten problem w statycznej kolekcji złożonej, która zawierała obserwowalną kolekcję i niektóre statyczne elementy. Byłem w stanie pozbyć się błędu, ustawiając atrybut x: Shared w CompositeCollection na "False", ale bardzo chciałbym wiedzieć, jaka jest prawdziwa, prawidłowa odpowiedź na to pytanie. Wydaje się prawie jak błąd. – BTownTKD

Odpowiedz

-1

miałem podobny problem, zajęło mi miesiące, aby znaleźć przyczynę, ale okazało się, że ^^ Sprawdź this site, zwłaszcza jeśli zmodyfikować listę z innego wątku. Wygląda na to, że masz kondycję, może to być ta sama!

+0

Wstawianie odpowiedzi. Link nie jest już ważny – CristianDonosoC

+0

Cóż, był to 5-częściowy bardzo długi artykuł, trudny do wstawienia ... –

2

miałem ten sam problem i moje zrozumienie IT
(kredyty https://stackoverflow.com/users/249723/vivien-ruiz na link)
jest po prostu, że jesteś „związany” mieć problemy, jeśli zmodyfikować ObservableCollection który bierze udział w ItemSource wiążącego. Zauważyłem, że wstawienie indeksu 0 "rozwiązuje" mój problem, ale nadal może się zawiesić.
Nie należy go modyfikować, ponieważ nie jest klasą bezpieczną dla wątków.
Lepszym rozwiązaniem jest działanie na kopii listy i przypisanie kopii do kolekcji bordered po zakończeniu operacji.
Na przykład: ObservableCollection<ListViewItem> newList = new ObservableCollection<ListViewItem>(mCurrentList); ... ListViewItem item = new ListViewItem(); item.Content = image; newList.Add(item); ... mPictures = newList;

Powiązane problemy