我使用了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控件,以便在adorner中显示拖动对象的数量。但无论我尝试什么,我都无法设法访问它,它以“此操作仅对应用了此模板的元素有效”结束。消息。
我认为我可以这样做:
this.contentPresenter.ContentTemplate.FindName("number", this.contentPresenter);
由于DataTemplate应该应用于ContentPresenter,但是没有...... 有关信息,adornedElement是发生拖动的ListViewItem。
如果您有任何想法......
答案 0 :(得分:1)
好的,所以我找到了如何实现我想要的目标。
我不知道为什么之前没想到它,为什么我之前没有发现任何相关内容。
我在尝试访问模板之前刚刚添加了一行:
this.UpdateLayout()
看起来它强制ContentPresenter和DataTemplate对象更新并“重新重新发送”,因此ContentPresenter实际上是由我的DataTemplate模板化的。