Я использовал пример кода, предоставленный Bea Stollnitz (http://bea.stollnitz.com/blog/?p=53),, чтобы включить перетаскивание в моем приложении, перетаскивать рекламодателя и т. Д.
Все отлично работает, мой перетаскиватель хорошо отображается, у меня все поведение, которое я хочу.
Но (да, всегда есть но), я не могу получить доступ к DataTemplate Drag Adorner, чтобы отобразить разные данные в зависимости от перетаскиваемых данных.
Я упростил код, но основы все еще там.
Это шаблон данных моего 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);
}
А это код, который инициирует рекламодателя
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, чтобы отобразить номер перетаскиваемого объекта в рекламном блоке. Но мне не удается получить к нему доступ, что бы я ни пытался. Он заканчивается «Эта операция действительна только для элементов, к которым применен этот шаблон». сообщение.
Я думал, что смогу сделать что-то вроде этого:
this.contentPresenter.ContentTemplate.FindName("number", this.contentPresenter);
Поскольку DataTemplate должен применяться к ContentPresenter, но нет ...
Для информации adornedElement - это ListViewItem, из которого происходит перетаскивание.
Если у вас есть идеи ...