Wpf 无法访问没有装饰器的元素上的装饰器

Wpf 无法访问没有装饰器的元素上的装饰器,wpf,mvvm,drag-and-drop,adorner,Wpf,Mvvm,Drag And Drop,Adorner,我尝试使用MVVM在WPF上进行一些拖放 我从Bea Stollnitz那里找到了这个链接,它提出了一个解决方案 在此处使用DragDropHelper: 但当我试图用一些事件生成组件(如datatemplate中的button或radioButton)对其进行自定义时,我在拖放时遇到了这个错误 “无法访问没有装饰器的元素上的装饰器。” 在这条线上 this.adornerLayer.Update(this.adornedlement) 您可以通过下载bea.stollnitz.com/file

我尝试使用MVVM在WPF上进行一些拖放

我从Bea Stollnitz那里找到了这个链接,它提出了一个解决方案 在此处使用DragDropHelper:

但当我试图用一些事件生成组件(如datatemplate中的button或radioButton)对其进行自定义时,我在拖放时遇到了这个错误

“无法访问没有装饰器的元素上的装饰器。”

在这条线上

this.adornerLayer.Update(this.adornedlement)

您可以通过下载bea.stollnitz.com/files/46/DragDropListBox.zip轻松复制它

替换

    <DataTemplate x:Key="pictureTemplate">
        <DataTemplate.Resources>
            <Style TargetType="Image">
                <Setter Property="Width" Value="50" />
                <Setter Property="Height" Value="50" />
                <Setter Property="Margin" Value="10" />
            </Style>
        </DataTemplate.Resources>
            <Image Source="{Binding Path=Location}" />
    </DataTemplate>
但我确定在哪里添加它,这个链接也是一样的

那提议

private bool IsItemDisconnected(object item)
{
  bool isDisconnected = false;

  var itemType = item.GetType();
  if (itemType.FullName.Equals("MS.Internal.NamedObject"))
  {
    isDisconnected = true;
  }

  return isDisconnected;
}

最后一个链接讨论了.NET4的问题,但我也有3.5上的bug,我想在这里发布,我已经找到了解决方案。读后


因此,似乎没有人受到我的问题的启发。我找到了bea stollnitz解决方案的另一个实现。使用,我最终使用事件生成模板进行了拖放。这个解决方案看起来更像是一个代码隐藏解决方案,而不是一个真正的mvvm解决方案(因为我们在视图模型中直接使用拖放事件进行管理),但是它工作起来没有bug,并且还有另一个优点,可以对拖放的项目进行排序。您有没有找到解决方案?我有同样的问题,我认为相同的代码。
public CustomAdorner(UIElement adornedElement) :
    base(adornedElement)
{
    visualChildren = new VisualCollection(this);
    @object = new Button {Content = "prova"};
    visualChildren.Add(@object);
}
protected override Visual GetVisualChild(int index)
{
    return visualChildren[index];
}
private bool IsItemDisconnected(object item)
{
  bool isDisconnected = false;

  var itemType = item.GetType();
  if (itemType.FullName.Equals("MS.Internal.NamedObject"))
  {
    isDisconnected = true;
  }

  return isDisconnected;
}
if (this.adornerLayer != null && this.contentPresenter.Content != null)
{
    this.adornerLayer.Update(this.AdornedElement);
}