Как плавно изменить порядок коллекции в списке? - PullRequest
1 голос
/ 16 марта 2012

Ситуация такая: у меня есть Observable Collection, в которой есть куча объектов, которые я затем отображаю в списке с помощью привязки.Затем периодически я получаю сообщение от внешнего сервера, который дает мне новый (или, возможно, тот же) порядок для этих объектов.Прямо сейчас я просто очищаю наблюдаемую коллекцию и добавляю каждый элемент обратно в указанном порядке.

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

Я думал о добавлении упорядочивания в качестве атрибута для каждого объекта.в ObservableCollection и затем вызывая сортировку по нему.Будет ли это выглядеть чисто?Я предполагаю, что это будет почти такой же эффект, как очистка и чтение всего.

Спасибо за любую помощь!

1 Ответ

1 голос
/ 16 марта 2012

Я создал класс, который наследуется от ObservableCollection. Этот класс имеет метод SetItems, в котором вам нужно передать вновь упорядоченные элементы. Ключевым в этом классе является то, что он будет подавлять событие отмены коллекции и, следовательно, не будет обновлять список при каждом добавлении элемента. Он выглядит лучше и загружается намного быстрее.

public class SuperObservableCollection<T> : ObservableCollection<T>
{
    public void SetItems(IEnumerable<T> items)
    {
        suppressOnCollectionChanged = true;
        Clear();
        AddRange(items);
    }

    private bool suppressOnCollectionChanged;
    public void AddRange(IEnumerable<T> items)
    {
        suppressOnCollectionChanged = true;

        if (items != null)
        {
            foreach (var item in items)
                Add(item);
        }

        suppressOnCollectionChanged = false;
        NotifyCollectionChanged();
    }

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (!suppressOnCollectionChanged)
            base.OnCollectionChanged(e);
    }

    public void NotifyCollectionChanged()
    {
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
}
...