在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;
}
}