Не удается получить доступ к шаблону drag adorner

#wpf #drag-and-drop #datatemplate #adorner

#wpf #перетаскивание #datatemplate #adorner

Вопрос:

Я использовал пример кода, предоставленный Беа Столлниц (http://bea.stollnitz.com/blog/?p=53), чтобы включить перетаскивание в моем приложении и drag adorner и т.д.

Все работает нормально, мой drag adorner хорошо отображается, у меня есть все поведение, которое я хочу.

Но (да, всегда есть «но»), я не могу получить доступ к DataTemplate Drag Adorner, чтобы отображать разные данные в зависимости от перетаскиваемых данных.

Я упростил код, но основы все еще там.

Это DataTemplate моего DragAdorner

 <DataTemplate x:Key="DragAndDropTemplate" DataType="{x:Type MyType}">
        <Grid>
            <Grid Opacity="0.5">
                <Border x:Name="HeaderBorder" CornerRadius="2" BorderThickness="1" Margin="5,2,5,2">
                   <Border x:Name="InsideBorder" CornerRadius="2" BorderThickness="1">
                      <TextBlock x:Name="number" Text="{Binding Name}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/>
                   </Border>
                </Border>
            </Grid>
            <Border Width="17" Height="17" BorderBrush="White" HorizontalAlignment="Center" VerticalAlignment="Center" CornerRadius="1" x:Name="numberContainer" Visibility="Collapsed">
                <TextBlock x:Name="number" Text="80" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/>
            </Border>
        </Grid>
    </DataTemplate>
  

Это код, который создает Adorner :

 if (this.draggedAdorner == null)
        {
            var adornerLayer = AdornerLayer.GetAdornerLayer(source);
            this.draggedAdorner = new DraggedAdorner(draggedData, dataTemplate, source, adornerLayer);
        }
  

И это код, который инициализирует adorner

 public DraggedAdorner(List dragDropData, DataTemplate dragDropTemplate, FrameworkElement adornedElement, AdornerLayer adornerLayer)
        : base(adornedElement)
    {
        this.adornerLayer = adornerLayer;
        this.contentPresenter = new ContentPresenter();

        this.contentPresenter.Content = dragDropData[0];

        this.contentPresenter.ContentTemplate = dragDropTemplate;
        this.adornerLayer.Add(this);
    }
  

draggedData, будет списком MyType, я получаю первый элемент в качестве содержимого ContentPresenter моего DraggedAdorner, поэтому может применяться DataTemplate.

Проблема в том, что я хочу получить доступ к numberContainer и элементу управления номером DataTemplate, чтобы отобразить номер перетаскиваемого объекта в adorner. Но мне не удается получить к нему доступ, что бы я ни пытался, все заканчивается словами «Эта операция действительна только для элементов, к которым применен этот шаблон». Сообщение.

Я думал, что смогу сделать что-то вроде этого :

 this.contentPresenter.ContentTemplate.FindName("number", this.contentPresenter);
  

Поскольку DataTemplate должен применяться к ContentPresenter, но нет…
Для информации AdornedElement — это элемент ListViewItem, из которого выполняется перетаскивание.

Если у вас есть какие-либо идеи…

Ответ №1:

Хорошо, итак, я нашел, как добиться того, чего я хотел.

Я не знаю, почему это не пришло в голову раньше, и почему я ничего не нашел об этом раньше.

Я только что добавил одну строку, прежде чем пытаться получить доступ к шаблону :

 this.UpdateLayout()
  

Похоже, что это заставляет объекты ContentPresenter и DataTemplate обновляться и «повторно изменять», поэтому ContentPresenter действительно шаблонизирован моим DataTemplate.