如何对ObservableCollection <t>进行排序,以便我的UI也能看到排序过程?</t>

时间:2011-02-05 10:07:11

标签: c# silverlight-4.0

我有Listbox,其item面板设置为wrappanel。我希望每当新项目添加到列表框时,我的集合应该被排序,并且该过程应该在UI上可见。我的意思是用户应该能够看到这种奇特的效果,以帮助他们识别物品正在被分类。我查看了stackoverflow上的一些帖子,他们建议使用CollectionViewSource。但是我的itemsource绑定到ViewModel中的ObservableCollection。

首先我写了这段代码。然而,当一个新的集合被绑定时,我无法看到容器中的项目从原始位置移动到新位置的奇特效果: -

 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 个答案:

答案 0 :(得分:1)

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

您的比较器出错:

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

顺便说一句。你的代码会立即为我执行...也许问题出在你的Photo类中?或者您的绑定/事件?

Photo.PhotoByteArr是否为计算值?