Не удается получить доступ к шаблону перетаскивания - PullRequest
1 голос
/ 05 апреля 2011

Я использовал пример кода, предоставленный 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, из которого происходит перетаскивание.

Если у вас есть идеи ...

1 Ответ

1 голос
/ 05 апреля 2011

Хорошо, поэтому я нашел, как добиться того, чего хотел.

Я не знаю, почему это не пришло в голову раньше, и почему я ничего не нашел об этом раньше.

Я только что добавил одну строку перед тем, как пытаться получить доступ к шаблону:

this.UpdateLayout()

Похоже, что это заставляет объекты ContentPresenter и DataTemplate обновляться и «повторно пересматривать», поэтому ContentPresenterдействительно шаблонизируется моим DataTemplate.

...