Невозможно получить доступ к украшателям элемента, который не имеет украшателей - PullRequest
2 голосов
/ 28 декабря 2011

Я пытаюсь сделать перетаскивание на WPF, используя MVVM

Я нашел эту ссылку от Bea Stollnitz http://bea.stollnitz, которая предлагает решение с помощью DragDropHelper здесь: bea.stollnitz.com/files/46/DragDropListBox.zip

но когда я пытаюсь настроить его с помощью некоторых компонентов, генерирующих события, таких как кнопка или радио-кнопка в табличке с данными, у меня появляется эта ошибка при перетаскивании

"Невозможно получить доступ к украшателям на элементе, который не имеет украшателей."

в этой строке

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>

т.е. добавление радиокнопки в шаблон

Я уже нашел несколько ссылок, но ни одна из них не объясняет ясного способа решения проблемы.

Нет событий, переданных на слой рекламодателя WPF

которые предлагают добавить этот код

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 Ответ

1 голос
/ 22 ноября 2012

Я хотел бы опубликовать здесь, что я нашел решение для этого. После прочтения Ошибка перетаскивания: невозможно получить доступ к элементам декорации на элементе, который не содержит элементов декорации

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