如何对列表框中的集合进行流畅的重新排序?

时间:2012-03-15 23:10:08

标签: c# .net windows-phone-7 listbox

情况是这样的:我有一个Observable Collection,其中有一堆对象,然后我使用绑定显示到列表框。然后定期,我从外部服务器收到一条消息,该消息为这些对象提供了一个新的(或可能相同的)排序。现在,我只清除可观察的集合,并使用指定的顺序添加每个项目。

这看起来不太好。有没有更好的方法来做这个?如果我能以某种方式让列表框重新排序并使用它有一个很好的重新排序动画,我真的很棒,但这可能要求太多。

我考虑过将序列作为属性添加到ObservableCollection中的每个对象,然后对其进行排序。这看起来干净吗?我的假设是它与清除和读取所有内容的效果几乎相同。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我创建了一个继承自ObservableCollection的类。此类有一个SetItems方法,您需要传入新订购的项目。此类中的键是它将禁止collectionchanged事件,因此每次添加项时都不会刷新列表框。它看起来更好,加载速度更快。

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));
    }
}