我有一个奇怪的例外。当使用特定索引将项目插入ObservableCollection两次时,我得到“LayoutCycleException”。
详细信息:我创建了一个Paging-Class,它将一个大的ObservableCollection(最多2000个项目)处理成一个页面(200个项目)。然后,用户可以转到另一个页面。此事件导致寻呼机将页面项设置为新的。除了一种情况外,一切正常:在具有特定索引(0,1,2,..)的页面中插入新项目会在第二次插入后触发异常。
任何人都知道为什么?
代码:
// Calculate the index for this page
var cp = (CurrentPage == 0) ? 1 : CurrentPage;
int pindex = index - ((cp - 1) * PageItemCount);
if (pindex >= 0 && pindex < PageItemCount)
{
// An item is inserted after the list is already loaded
if (pindex == 0)
{
// Check if the page has mor items than it should
if (_pagedItems.Count >= PageItemCount)
{
// Remove last item from page
_pagedItems.RemoveAt(_pagedItems.Count - 1);
}
_pagedItems.Insert(pindex, item);
}
else if (_pagedItems.Count < PageItemCount)
{
// --> EXCEPTION at third insert
_pagedItems.Insert(pindex, item);
}
}
编辑(解决方案)
我在代码中发现了这个错误。问题是,UI没有时间更新集合更改(UI没有响应)。很奇怪的bug,花了我很长时间才找到它......
一个简单的 Thread.Sleep(10)改变了整个事情=)这次ui可以改变集合,一切正常。
答案 0 :(得分:0)
异常不是来自ObservableCollection,而是来自在InsertItem之后更新布局时生成的事件。
使用LayoutUpdated事件处理程序时通常会生成LayoutCycleDetection。您可能会无意中创建一个无限循环。在这种情况下,_pagedItems.Insert创建一个LayoutUpdate事件,该事件可能正在调用_pagedItems以再次插入。
如果在那里找不到,则可能有一个自定义控件调用LayoutUpdated并导致异常。