PanelDragDropTarget и ListBoxDragDropTarget: что именно перетаскивается? - PullRequest
1 голос
/ 06 сентября 2011

Приложение My Silverlight 4 позволяет перетаскивать из ListBoxDragDropTarget в PanelDragDropTarget.

Приложение имеет Person объекты, которые представляют собой модели, представляющие людей, и PersonControl пользовательские элементы управления, имеющие Person в качестве DataContext.

Для справки соответствующий код:

<toolkit:ListBoxDragDropTarget x:Name="dtListBox" Grid.Row="2" AllowedSourceEffects="Copy" AllowDrop="True" 
                               HorizontalContentAlignment="Stretch" 
                               VerticalAlignment="Top" VerticalContentAlignment="Stretch">
         <!-- FilteredMembers is of type ObservableCollection<Person> -->
    <ListBox ItemsSource="{Binding FilteredMembers}" 
                               MinWidth="42"
                               MinHeight="42">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <my:PersonControl />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
</toolkit:ListBoxDragDropTarget>

и

<toolkit:PanelDragDropTarget AllowDrop="True" AllowedSourceEffects="Copy,Move" 
              Drop="PanelDragDropTarget_Current_Drop">
    <StackPanel>
        <ctl:PersonControl Margin="3,3,3,3" x:Name="pcCurrent"></ctl:PersonControl>
    </StackPanel>
</toolkit:PanelDragDropTarget>

Пока все хорошо.Когда я перетаскиваю на PanelDragDropTarget, я получаю Person.

Однако я также разрешаю перетаскивать с PanelDragDropTarget на другой PanelDragDropTarget.В этом случае, вместо Person, отброшенный объект является PersonControl.

Таким образом, отброшенный объект может быть либо Person, либо PersonControl в зависимости от того, откуда он взялся.

Я действительно хочу перетаскивать Person объекты во всех случаях, а не перемещаться вокруг PersonControl.Как я могу изменить свой PanelDragDropTarget так, чтобы перетаскивание тянуло Person, а не PersonControl?

Я рассмотрел этот очень похожий вопрос:

Перетаскивание изListBoxDragDropTarget to PanelDragDropTarget

, но не понимаю, как это решает проблему.

1 Ответ

1 голос
/ 01 декабря 2011

Вы совершенно правы относительно разницы между способом, которым PanelDragDropTargets и ListBoxDragDropTargets передают отброшенные объекты.При перетаскивании между 2 ListBoxDragDropTargets вы переносите часть данных, привязанную к элементу управления, тогда как при перетаскивании между 2 PanelDragDropTargets передается «подобранный» UIElement.

Лучший способ, который я нашел, чтобы обойти этоявляется создание нового класса из PanelDragDropTarget, который ожидает, что на него будет сброшен фрагмент данных вместо UIElement.Новый класс хранит объект данных в DataContext класса / элемента управления.Это позволяет коду, подобному вашему, работать.

Класс:

public class ElementDragDropTarget : PanelDragDropTarget
{
    protected override bool CanAddItem(Panel itemsControl, object data)
    {
        return true;
    }

    protected override void InsertItem(Panel itemsControl, int index, object data)
    {
        itemsControl.DataContext = data;
    }

    protected override bool CanRemove(Panel itemsControl)
    {
        return true;
    }

    protected override void RemoveItem(Panel itemsControl, object data)
    {
        itemsControl.DataContext = null;
    }

    protected override void RemoveItemAtIndex(Panel itemsControl, int index)
    {
        itemsControl.DataContext = null;
    }

    protected override object ItemFromContainer(Panel itemsControl, UIElement itemContainer)
    {
        return itemsControl.DataContext;
    }
}

Редактирует ваш код:

<local:ElementDragDropTarget AllowDrop="True" AllowedSourceEffects="Copy,Move" Drop="PanelDragDropTarget_Current_Drop">
    <Grid>
        <ctl:PersonControl Margin="3,3,3,3" x:Name="pcCurrent"></ctl:PersonControl>
    </Grid>
</local:ElementDragDropTarget >

Я понимаю, что это решение позволяет только одинэлемент для перетаскивания в ElementDragDropTarget.Я предполагаю, что это то, что вы хотите сделать, потому что, если вы хотите добавить в него несколько объектов данных, вам, вероятно, следует просто использовать другой ListBoxDragDropTarget (особенно если вы просто используете StackPanel).

...