2011-02-05 66 views
3

我有Listbox的項目面板設置爲wrappanel。我希望每當一個新項目被添加到列表框時,我的集合應該被排序並且該過程應該在UI上可見。我的意思是用戶應該能夠看到這種奇特的效果,以幫助他們識別物品正在分類。我看了一些關於stackoverflow的帖子,他們建議使用CollectionViewSource。但是我的itemsource綁定到ViewModel中的ObservableCollection。如何對ObservableCollection <T>進行排序,以便我的UI還可以看到排序過程?

首先我寫了這段代碼。但它可以作爲一個新的集合勢必我看不到花哨的效果,其中在容器中的項目只是移動到新的位置從原來的位置: -

var photoList = PhotosToUpload.ToList<Photo>(); 
      photoList.Sort(new PhotoSorter()); 
      PhotosToUpload = new ObservableCollection<Photo>(photoList); 

這是我的課: -

public class PhotoSorter : IComparer<Photo> 
    { 

     public int Compare(Photo x, Photo y) 
     { 
      return x.PhotoByteArr.Length - x.PhotoByteArr.Length; 
     } 
    } 

然後我寫了一個簡單的泡泡排序算法。這實現了預期的效果,但我不知道爲什麼需要很長時間。我知道這是最無效的算法,任何人都可以想到,但仍然排序10項不應該超過一秒鐘。這需要4-5秒。

for (int i = 0; i < PhotosToUpload.Count; i++) 
      { 
       for (int j = 0; j < PhotosToUpload.Count - 1 - i; j++) 
       { 
        if (PhotosToUpload[j].PhotoByteArr.Length > PhotosToUpload[j + 1].PhotoByteArr.Length) 
        { 
         Photo photo = PhotosToUpload[j]; 
         PhotosToUpload[j] = PhotosToUpload[j + 1]; 
         PhotosToUpload[j + 1] = photo; 
        } 
       } 
      } 

誰能告訴我什麼是我可以在這個時間點做的最好?爲什麼泡沫分類需要這麼長時間,即使只有10件物品?

回答

1

要檢查更改,請使用CollectionChanged事件。

你在你的比較器有一個錯誤:

return x.PhotoByteArr.Length - y.PhotoByteArr.Length; 

BTW。你的代碼立即執行給我...也許問題出在你的Photo類中?或者你的綁定/事件?

Photo.PhotoByteArr的計算值?

相關問題