Перетаскивание списка: индекс выпадающего элемента - PullRequest
2 голосов
/ 31 января 2011

Я использую Listbox, завернутый в ListBoxDragDropTarget (из набора инструментов Silverlight). Это ListBox может быть вручную изменено пользователем. Однако последний элемент всегда должен находиться в нижней части ListBox и не может быть перемещен вообще. Я нашел способ отменить этот последний элемент перемещения, но если я перетащу другой элемент ниже этот последний элемент, он будет перемещен.

Я могу найти индекс перетаскиваемого элемента, используя этот код в событии Drop ListBox:

object data = e.Data.GetData(e.Data.GetFormats()[0]);

ItemDragEventArgs dragEventArgs = data as ItemDragEventArgs;
SelectionCollection selectionCollection = dragEventArgs.Data as SelectionCollection;
if (selectionCollection != null)
{
    MyClass cw = selectionCollection[0].Item as MyClass;
    int idx = selectionCollection[0].Index.Value;   
}

Однако это только дает мне индекс до операции перетаскивания.

У меня следующий вопрос: есть ли способ узнать новый индекс выпадающего предмета? Таким образом, если индекс = последняя позиция в списке, я могу переместить его в первую позицию.

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 01 февраля 2011

Хорошо, я нашел способ сделать это. Я связал ItemDragCompleted событие ListBoxDragDropTarget и сделал следующее:

private void dropTarget1_ItemDragCompleted(object sender, ItemDragEventArgs e)
{
    var tmp = (e.DragSource as ListBox).ItemsSource.Cast<MyClass>().ToList();

    SelectionCollection selectionCollection = e.Data as SelectionCollection;
    if (selectionCollection != null)
    {
        MyClass cw = selectionCollection[0].Item as MyClass;

        int idx = tmp.IndexOf(cw);
        if (idx == tmp.Count - 1)
        {
            tmp.Remove(cw);
            tmp.Insert(tmp.Count - 1, cw);

            MyListBox.ItemsSource = new ObservableCollection<MyClass>(tmp);
        }
}

}

Поскольку DragSource представляет список, с новым «расположением» элементов, поэтому я могу проверить, находится ли элемент в конце, и переместить его в этом случае.

Единственная оставшаяся проблема заключается в том, что она вызывает мерцание на экране из-за того, что предмет был уронен, а затем перемещен.

Я все еще открыт для любого другого (лучшего) предложения.

2 голосов
/ 01 февраля 2011

У меня точно такая же проблема. Я думаю, что возможно будет пройтись по прямоугольникам элементов в ListBox и посмотреть, есть ли в них var point = args.GetPosition (myListBox); . Но я надеюсь на более легкий путь ...

Редактировать: Проблема с этим, однако, заключается в том, что вы не получаете эффект гравитации, который уже встроен в Silverlight, где только половина вышеупомянутого и половина нижнего прямоугольника используются, чтобы поместить его в список. *

...