无法访问拖动装饰器模板

时间:2011-04-05 14:40:21

标签: wpf drag-and-drop datatemplate adorner

我使用了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。

如果您有任何想法......

1 个答案:

答案 0 :(得分:1)

好的,所以我找到了如何实现我想要的目标。

我不知道为什么之前没想到它,为什么我之前没有发现任何相关内容。

我在尝试访问模板之前刚刚添加了一行:

this.UpdateLayout()

看起来它强制ContentPresenter和DataTemplate对象更新并“重新重新发送”,因此ContentPresenter实际上是由我的DataTemplate模板化的。