我使用了 Bea Stollnitz ( http://bea.stollnitz.com/blog/?p=53 ) 提供的示例代码,以便在我的应用程序中启用拖放,以及拖放装饰器等。
一切正常,我的拖曳装饰器显示得很好,我有我想要的所有行为。
但是(是的,总是有一个但是),我无法访问 Drag Adorner 的 DataTemplate,以便根据拖动的数据显示不同的数据。
我已经简化了代码,但基础仍然存在。
这是我的 DragAdorner 的 DataTemplate
<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的列表,我把第一项作为我的DraggedAdorner的ContentPresenter的内容,这样DataTemplate就可以应用了。
问题是,我想访问 DataTemplate 的 numberContainer 和 number 控件,以便在装饰器中显示拖动对象的数量。但无论我尝试什么,我都无法访问它,它以“此操作仅对应用了此模板的元素有效”结尾。信息。
我坚持我可以做这样的事情:
this.contentPresenter.ContentTemplate.FindName("number", this.contentPresenter);
由于 DataTemplate 应该适用于 ContentPresenter,但不...有关信息, adornedElement 是发生拖动的 ListViewItem。
如果你有任何想法...