программно перемещать элементы в UWP ListView без обновления - PullRequest
0 голосов
/ 02 мая 2018

Следующая проблема довольно долго занимает меня, кажется, что она настолько проста, но не работает. Это сводится к этому:

  • Наличие ListView, который связан с некоторой подходящей коллекцией в коде позади (ObservableCollection, ReactiveList или тому подобное)
  • Я перемещаю предметы по одному каждые x секунд
  • при каждом движении все предметы обновляются (по крайней мере, так выглядит. На долю секунды все предметы исчезают, а затем снова появляются в новом порядке)

должен быть способ сохранить другой элемент и просто "переместить" перемещенный элемент. Мне даже наплевать на причудливую анимацию перевода для перемещенного элемента, я просто хочу, чтобы другие элементы оставались на экране. Конечно, мой реальный сценарий использования - это не случайное перемещение элементов, а сортировка списка по коду. Но я отследил проблему до этого простого случая.

имея простой ListView и привязанный к нему, например, для ObservableCollection в CodeBehind ниже приведен мой фиктивный код для перемещения по элементам:

_timer = new Timer(async _ =>
{
    Random r = new Random();
    var randomIndex = r.Next(0, contactsCvsSource.Count - 1);

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { contactsCvsSource.Move(randomIndex, 5); });
}
, null, 0, 1000);

1 Ответ

0 голосов
/ 03 мая 2018

при каждом движении все предметы обновляются (по крайней мере, так выглядит. На долю секунды все предметы исчезают, а затем снова появляются в новом порядке

Метод Move ObservableCollection используется для улучшения производительности обновления пользовательского интерфейса. Хеш-значение элемента пользовательского интерфейса не изменится при вызове метода Move, оно просто обновит ListView и не создаст заново.

Я просто хочу, чтобы другие элементы оставались на экране. Конечно, мой реальный сценарий использования - это не случайное перемещение элементов, а сортировка списка по коду.

По вашему требованию вы можете реализовать эту функцию с помощью Insert и Remove метода.

var _timer = new Timer(async _ =>
 {
     Random r = new Random();
     var randomIndex = r.Next(0, Items.Count - 1);
     await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
         Items.Insert(5,Items[randomIndex] );
         Items.RemoveAt(randomIndex);                   
     });
 }
 , null, 0, 1000);      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...