【问题标题】:LayoutCycleDetection - Observablecollection insert twiceLayoutCycleDetection - Observablecollection 插入两次
【发布时间】:2014-05-21 11:51:48
【问题描述】:

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

【问题讨论】:

    标签: windows-phone-8 observablecollection


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨。谢谢你的帮助。我在我的代码中发现了这个错误。我更新了我的问题。
    • Thread.Sleep(10) 掩盖了一个更重要的问题。您应该发布使用 _pagedItems 的 XAML 部分,以便其他人可以找到合适的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多