GridView
не имеет собственного API для поддержки этой функции, но мы можем достичь цели другими способами.
Для простоты мы предполагаем, что ваш DataSource
имеет тип ObservableCollection<int>
. Если ваш фактический тип более сложный, чем int, вам необходимо заранее переопределить метод EqualTo
для этого класса.
1. Разрешить CanDragItems
и добавить соответствующие события
<GridView ...
CanDragItems="True"
DragItemsCompleted="ModulesGridView_DragItemsCompleted">
</GridView>
2. Извлеките последний элемент заранее при загрузке сбора данных
private int LastItem = 0;
...
for (int i = 0; i < 20; i++)
{
DataSource.Add(i);
}
LastItem = DataSource.Last();
3. Проверьте позицию последнего элемента в событии DragItemsCompleted
private void ModulesGridView_DragItemsCompleted(ListViewBase sender, DragItemsCompletedEventArgs args)
{
int index = DataSource.IndexOf(LastItem);
if (index != DataSource.Count - 1)
{
DataSource.Move(index, DataSource.Count - 1);
}
}
Другими словами, мы не вмешиваемся в процесс изменения порядка элементов пользователем, но после изменения порядка мы обнаруживаем позиция последнего элемента. Если это не конец, мы перемещаем его снова.
Спасибо.