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

时间:2011-12-28 12:16:35

标签: wpf mvvm drag-and-drop adorner

我尝试使用MVVM对WPF进行拖放操作

我从Bea Stollnitz http://bea.stollnitz找到了这个链接,提出了一个解决方案 使用DragDropHelper:bea.stollnitz.com/files/46/DragDropListBox.zip

但是当我尝试使用某些事件来自定义它时,会在datatemplate中生成按钮或radioButton等组件,我在拖放时会出现此错误。降

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

在这一行

this.adornerLayer.Update(this.AdornedElement);

您可以通过下载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>

通过

    <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>
        <Grid>
            <Image Source="{Binding Path=Location}" />
            <RadioButton />
        </Grid>
    </DataTemplate>

即。在模板中添加radiobutton

我已经找到了一些链接,但没有一个解释明确解决问题的方法。

No events passed to WPF adorner layer

建议添加此代码

VisualCollection visualChildren;     FrameworkElement @object;

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

但我确定在哪里添加它以及此链接的相同内容

http://social.msdn.microsoft.com/Forums/en/wpf/thread/e6643abc-4457-44aa-a3ee-dd389c88bd86?prof=required

建议

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

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

  return isDisconnected;
}

这最后一个链接谈论.NET 4问题,但我也有3.5的错误

1 个答案:

答案 0 :(得分:1)

我想在这里发帖说我找到了解决方法。阅读Drag drop error : Cannot access adorners on element that has no adorners

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