LayoutCycleDetection - Observablecollection插入两次

时间:2014-05-21 11:51:48

标签: windows-phone-8 observablecollection

我有一个奇怪的例外。当使用特定索引将项目插入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可以改变集合,一切正常。

1 个答案:

答案 0 :(得分:0)

异常不是来自ObservableCollection,而是来自在InsertItem之后更新布局时生成的事件。

使用LayoutUpdated事件处理程序时通常会生成LayoutCycleDetection。您可能会无意中创建一个无限循环。在这种情况下,_pagedItems.Insert创建一个LayoutUpdate事件,该事件可能正在调用_pagedItems以再次插入。

如果在那里找不到,则可能有一个自定义控件调用LayoutUpdated并导致异常。