如何对ObservableCollection 进行排序,以便我的UI还可以看到排序过程?

问题描述:

我有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件物品?

要检查更改,请使用CollectionChanged事件。

你在你的比较器有一个错误:

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

BTW。你的代码立即执行给我...也许问题出在你的Photo类中?或者你的绑定/事件?

Photo.PhotoByteArr的计算值?