2012-03-15 50 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