在WPF中使用虚拟包装面板的选项并不多。由于一个或另一个原因,MS决定不在标准库中提供一个。

如果有人能大胆地为以下Codeplex项目的第一个工作项提供众包答案(和解释),我将不胜感激:

http://virtualwrappanel.codeplex.com/workitem/1

谢谢!



问题摘要:

我最近尝试使用此项目中的虚拟化包装面板,但遇到了一个错误。

重现步骤:


创建列表框。
将虚拟包装面板设置为listboxpanel模板中的itemhost。
将列表框的itemsource绑定到可观察的集合。
从可观察的后备集合中删除一个项目。


Measure.Override中的Debug.Assert失败(Debug.Assert(child == _children [childIndex],“生成了错误的子项”);),并且继续执行会导致Cleanup方法中出现空异常(请参见所附的屏幕截图)。

如果您能够纠正此问题,请告诉我。

谢谢,

AO



码:

http://virtualwrappanel.codeplex.com/SourceControl/list/changesets#

alt text http://virtualwrappanel.codeplex.com/Project/Download/AttachmentDownload.ashx?ProjectName=virtualwrappanel&WorkItemId=1&FileAttachmentId=138959

最佳答案

OnItemsChanged方法需要正确处理args参数。请参阅此question以获取更多信息。复制该问题的代码,您将需要更新OnItemsChanged,如下所示:

protected override void OnItemsChanged(object sender, ItemsChangedEventArgs args) {
    base.OnItemsChanged(sender, args);
    _abstractPanel = null;
    ResetScrollInfo();

    // ...ADD THIS...
    switch (args.Action) {
        case NotifyCollectionChangedAction.Remove:
        case NotifyCollectionChangedAction.Replace:
            RemoveInternalChildRange(args.Position.Index, args.ItemUICount);
            break;
        case NotifyCollectionChangedAction.Move:
            RemoveInternalChildRange(args.OldPosition.Index, args.ItemUICount);
            break;
    }
}

08-28 02:40