2012-03-15 37 views
1

情况是这样的:我有一个Observable集合,它有一堆对象,然后使用绑定显示给列表框。然后定期从外部服务器收到一条消息,这个消息给了我一个新的(或者可能相同的)这些对象的排序。现在,我只清除可观察的集合,并使用指定的顺序将每个项目添加回来。如何在列表框中流畅地重新排序集合?

这看起来不太好。有没有更好的方式去做这件事?如果我能以某种方式让列表框重新排序并且有一个很好的重新排序动画,那我真的很棒,但这可能会要求太高。

我曾想过将排序作为属性添加到ObservableCollection中的每个对象,然后对它进行排序。这看起来干净吗?我的假设是,它与清除它并阅读所有内容几乎是一样的效果。

感谢您的帮助!

回答

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

这看起来不错,生病今天晚些时候或明天就给它一个镜头然后我会在这里更新。谢谢您的帮助! – Nico 2012-03-16 22:16:52

+0

按预期工作,再次感谢! – Nico 2012-03-17 19:12:34