2016-04-28 60 views
1

によってスローだから私のアプリケーションでは、私は、とき私はItemsControlUniformGridデータは、それだけで正常に動作します。この指定された引数が有効な値の範囲外です。パラメータ名インデックス。 ObservableCollection.Add()メソッド

<ItemsControl Name="ImageItemsControl" ItemsSource="{Binding Path=ObservableCollectionSource}"> 
           <ItemsControl.ItemsPanel> 
            <ItemsPanelTemplate> 
             <UniformGrid Rows="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
             </UniformGrid> 
            </ItemsPanelTemplate> 
           </ItemsControl.ItemsPanel> 
          </ItemsControl> 

ようObservableCollection<Image> にバインドされた使用されたものに関しては、いくつかの画像を表示する必要がありますただプログラムを起動して、 しかし、ある時点で、私はグリッドからすべての画像をアンロードする必要があります。私は戻って画像を追加する必要がある場合、正しく動作しているよう一見

int limit = ObservableCollectionSource.Count -1; 
       for (int i = limit; i >= 0; i--) 
       { 
        ObservableCollectionSource.RemoveAt(i); 
       } 

、しかし:私は私のコレクションに.Clear()を呼び出す場合、それは私が結合壊すので は、ちょうどこのようなもので、すべての要素の1を削除します(ドラッグアンドドロップ、または開いているファイルダイアログから - 結果は同じです)。 この例外をスローする

指定された引数が有効な値の範囲外です。パラメータ 名前インデックス

私は.Add()メソッドを呼び出します。ここで

Image img = CreateImage(cImg); 
        try 
        { 
         ObservableCollectionSource.Add(img); 
        } 
        catch (Exception ex) 
        { 
         MessageBox.Show("Exception has occured: " + ex.Message, "Exception", MessageBoxButton.OK, MessageBoxImage.Warning); 
        }  

私は、ファイルから読み込まれたビットマップから必要な「設定」とWPFのイメージを作成し、そして、私のObservableCollectionに追加してみてください。

それがうまくいかない理由、または私が研究を行うための指示はありますか?

グーグルで回っても何の結果も得られませんでした(たぶん私の検索クエリをうまく策定していないかもしれません)。

私は間違ってバインドしていますか?タスクに間違ったコントロールを使用しますか?

わかりません。

すべてのヘルプは大幅に

EDITを高く評価されています。ここではスタックトレースiは

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.WeakEventManager.ListenerList`1.DeliverEvent(Object sender, EventArgs e, Type managerType) 
    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.OnViewCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) 
    at System.Windows.WeakEventManager.ListenerList`1.DeliverEvent(Object sender, EventArgs e, Type managerType) 
    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.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 MainDesk.MainWindow.AddImagesToGrid() in D:\MainDesk\MainDesk\UI\MainWindow.xaml.cs:line 427 
    at MainDesk.MainWindow.AddCarrierImageBtn_Click(Object sender, RoutedEventArgs e) in D:\MainDesk\MainDesk\UI\MainWindow.xaml.cs:line 167 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
    at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
    at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e) 
    at System.Windows.Controls.MenuItem.InvokeClickAfterRender(Object arg) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
    at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.ProcessQueue() 
    at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
    at System.Windows.Application.RunDispatcher(Object ignore) 
    at System.Windows.Application.RunInternal(Window window) 
    at System.Windows.Application.Run(Window window) 
    at System.Windows.Application.Run() 
    at MainDesk.App.Main() in D:\MainDesk\MainDesk\obj\Debug\App.g.cs:line 0 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
+0

私はその部分を見逃しているに違いない。あなたのプログラムには、一度にコレクションにアクセスできる複数のスレッドが含まれていますか? –

+0

いいえ、私のところにはありません。それは、ユーザーが読み込んだ画像を表示するシンプルな "運動" wpfアプリです。また、それらを一度にロードすることも、1つずつロードすることもできます。 – Michael

+0

'ObservableCollection 'が奇妙な方法で壊れていないかぎり、それは考えにくいですが、これは私が考えることができる唯一の説明です。私。何かがコレクションの内部状態を壊してしまいました。通常は、並行性が悪い場合にのみ発生します。あなたは 'Task.Run'や友達のようなもので余分なスレッドを生成していないと確信していますか? –

答えて

1

を得ることExceptionからであるので、私のミスがあった場所、私は考え出したようです。

まず、 .Clear()については、私の縛りを破る。 - 私は完全にNotifyPropertyChangedを忘れてしまった。しかし、私はこの部分を見つけ出すと例外が残った。

これまでのところ、私はアプリケーションのシンプルさを過大評価しました。その結果、十分な関連情報が掲載されていませんでした。 小さなアプリで問題を再現できなかったのですが、それには何も入っていませんでしたが、とItemsPanelの1つがUniformGridです。私は問題がどこか他の場所にあることを知っていた。

だから、私はいくつかの理由で、私は疑問にObservableCollectionImage秒を追加されたと同時に、私はまた別のItemsPanelためItemsSourceた別のObservableCollectionに、この画像を追加したことが、判明しました。 2つのパネルは同じですが、お互いの知識はなく、決して接続されていません。

VisibilityとしてVisibility.Collapsedと入力してください。ObservableCollectionにアイテムを追加していました。

今、私は一度に1つだけObservalbeCollectionと働く - 問題はなくなりました。

私はまだそのような動作の原因は何もわかっていません。

関連する問題