#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.