UWP: используйте Move вместо Remove + Insert при переупорядочении элементов в ListView. - PullRequest
0 голосов
/ 07 ноября 2019

Я использую ListView , связанный с ObservableCollection . Я настроил элемент управления для поддержки переупорядочения элементов внутри коллекции со следующими настройками:

<ListView
    AllowDrop="True"
    CanDragItems="True"
    CanReorderItems="True">
    ...
</ListView>

Все это прекрасно работает, за исключением того, что я заметил, что, несмотря на исходную коллекцию, поддерживающую Move () метод, представление списка делает Remove () + Insert () вместо этого.

Проблема в том, что я также реализовал функцию отмены-возврата в коллекции, отвечая на события CollectionChanged. И поскольку представление списка выполняет два действия вместо одного, мне нужно дважды отменить, чтобы перейти в состояние перед перемещением. С другой стороны, если я вызываю метод Move () для коллекции с помощью кода, требуется только одна отмена (как и должно быть).

Поэтому мой вопрос: как заставить принудительно просмотреть списокиспользовать метод Move ()?

1 Ответ

3 голосов
/ 07 ноября 2019

Итак, мой вопрос: как я могу заставить представление списка использовать метод Move ()?

Текущий ListView не предоставляет свойство или метод, который поддерживаетэта операция.

Источник данных ListView не обязательно ObservableCollection, это может быть массив, список или другая коллекция, и эти коллекции могут не иметь Move() метода.

Но большинство коллекций поддерживают методы Remove и Insert. Когда ListView выполняет переупорядочение данных, наилучшим выбором является вызов методов Remove и Insert.

На этой основе также реализуется метод Move ObservableCollection. В соответствии с текущим открытым исходным кодом .Net Core , я нашел реализацию из ObservableCollection.Move.

/// <summary>
/// Called by base class ObservableCollection&lt;T&gt; when an item is to be moved within the list;
/// raises a CollectionChanged event to any listeners.
/// </summary>
protected virtual void MoveItem(int oldIndex, int newIndex)
{
    CheckReentrancy();

    T removedItem = this[oldIndex];

    base.RemoveItem(oldIndex);
    base.InsertItem(newIndex, removedItem);

    OnIndexerPropertyChanged();
    OnCollectionChanged(NotifyCollectionChangedAction.Move, removedItem, newIndex, oldIndex);
}

А вот реализация .Net Framework. (Почти такая же)

Хотя UWP не имеет открытого исходного кода, принципиальной разницы нет.

Видно, что дажеObservableCollection использует внутренние методы Remove и Insert, поэтому ListView не делает преднамеренного акцента на использовании метода ObservableCollection.Move для регулировки положения элементов в коллекции.

С наилучшими пожеланиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...