我正在实现这里提到的Drag drop解决方案:
http://bea.stollnitz.com/blog/?p=53
我很少ListBox
es +与WrapPanel
和项目。我应该能够将项目从任何一个框拖放到任何其他框中。
当我拖动一个项目并将其移动到另一个框时,它会抛出错误:
无法访问没有装饰者的元素上的装饰。
在这一行:
if (this.adornerLayer != null)
{
this.adornerLayer.Update(this.AdornedElement);
}
我试图看到AdornedElement的值,我看到它有这个值:
ListBoxItem : DisconnectedItem
。我看到了ListBoxItem
的内容,似乎它还断开了项目。
如果我使用相同的列表框移动我的项目,也会发生此问题。我的列表框使用wrapPanel作为ItemsPanelTemplate
。
层次结构树就像这样的列表框:
1列表框: 用户控件 边界 格 格 边界 边界 边界 的ScrollViewer 列表框 ItemsPanel
其他3个ListBoxes: 用户控件 边界 格 格 格 的tabcontrol TabItem的 格 边界 边界 边界 的ScrollViewer 列表框 ItemsPanel
AnyOne谁遇到过这个问题或者可以帮助我解决出错的问题?
答案 0 :(得分:4)
我也能够重现这个问题。我可以通过将代码行更改为:
来防止错误停止if (this.adornerLayer != null && this.contentPresenter.Content != null)
{
this.adornerLayer.Update(this.AdornedElement);
}
答案 1 :(得分:1)
这是一个.Net 4.0错误
您也可以在标签控件中看到这一点。
任何时候都没有显示某些东西,一旦你从视觉树上掉下来,你的绑定就会搞砸了。
答案 2 :(得分:1)
尝试jhamm建议的方法,不幸的是,它对我的情况不起作用。我最后修改了微软论坛上的线程中提出的代码,如上所述:
ContentControl contentCtl = this.AdornedElement as ContentControl;
if (contentCtl == null ||
contentCtl.Content == null)
{
return;
}
var contentType = contentCtl.Content.GetType();
if (contentType.FullName.Equals("MS.Internal.NamedObject"))
{
return;
}
if (this.adornerLayer != null &&
this.contentPresenter.Content != null)
{
try
{
this.adornerLayer.Update(this.AdornedElement);
}
支票
var contentType = contentCtl.Content.GetType();
if (contentType.FullName.Equals("MS.Internal.NamedObject"))
{
return;
}
项目断开时失败。
顺便说一下,报告的bug在4.5中被修复了
答案 3 :(得分:1)
我可以在调用Update()之前检查是否可以找到UIElement的adornerlayer。
if (AdornerLayer.GetAdornerLayer(uIElement) != null)
{
this.adornerLayer.Update(uIElement);
}