VariusRain
@VariusRain
музыкант-программист-конструктор

WPF ListBox как вручную отсортировать список перетаскиванием элементов мышкой?

Привет всем!

Имеется список файлов выводимый в листбокс:
<ListBox ItemsSource="{Binding FileList}" SelectedItem="{Binding CurrentFile}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock VerticalAlignment="Center" Text="{Binding Path=Name}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Есть необходимость поменять порядок файлов прежде чем его отдавать дальше на обработку. Подумал, что самое простое - это реализовать перетаскивание элементов мышкой.

Знаю о том, что можно попробовать использовать события драг-н-дроп, однако вся эта "событийность" в данном случае рушит весь смысл mvvm (ну или я просто не умею её готовить).

Последние два дня потратил на чтение интернетов, нашёл кучу библиотек, которые реализуют это, конечно, да вот только по какой-то логике, делают они это между двумя листами, а в рамках одного я не нашёл ни одного решения.
Подумал, что, наверное, я просто дурак и это вообще стандартный функционал листа, но чтение документации и MSDN ответа на данный вопрос не дали.

Подскажите пожалуйста направление, куда смотреть?

Заранее благодарю!
  • Вопрос задан
  • 497 просмотров
Решения вопроса 1
FoggyFinder
@FoggyFinder
Есть замечательная библиотека которая практически все делает за вас:

GongSolutions.WPF.DragDrop

Все, что вам нужно в простейших сценариях, это установить на разрешение перетаскивать ИЗ и В:

dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"


Обновляю ответ в связи с комментарием:

Общая рекомендация:

Если вы столкнулись с проблемой при использовании какой-то библиотеки, то задавайте конкретный вопрос с ней связанный, приводя минимально воспроизводимый пример. В противном случае начинается гадание на кофейной гуще.


Привожу минимальный пример демонстрирующий что перетаскивание в пределах списка не является проблемой.

VM:

public class MainVM
{
    private IEnumerable<FileInfo> GetFiles() =>
        Directory.EnumerateFiles(Directory.GetCurrentDirectory())
                    .Select(path => new FileInfo(path));
    public MainVM()
    {
        FileList = new ObservableCollection<FileInfo>(GetFiles());
    }
    public FileInfo CurrentFile { get; set; }
    public ObservableCollection<FileInfo> FileList { get; }
}


View:

пространство имен:

xmlns:dd="urn:gong-wpf-dragdrop"

сам список:

<ListBox
    dd:DragDrop.IsDragSource="True"
    dd:DragDrop.IsDropTarget="True"
    ItemsSource="{Binding FileList}"
    SelectedItem="{Binding CurrentFile}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock VerticalAlignment="Center" Text="{Binding Name}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>


Гиф с результатом:

5dee28369295b074649445.gif
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы