c# - 我如何对 ObservableCollection<T> 进行排序,以便我的 UI 也能看到排序过程?

标签 c# silverlight-4.0

我有一个列表框,其项目面板设置为包装面板。我希望每当将新项目添加到列表框时,我的集合都应该排序并且该过程应该在 UI 上可见。我的意思是用户应该能够看到那种奇特的效果,以帮助他们识别该项目正在排序。我看了一些关于 stackoverflow 的帖子,他们建议使用 CollectionViewSource。但是,我的项目源绑定(bind)到 ViewModel 中的 ObservableCollection。

首先我写了这段代码。但是它可以工作,因为绑定(bind)了一个新集合,我看不到容器中的项目只是从原始位置移动到新位置的奇特效果:-

 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;

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

Photo.PhotoByteArr 是计算值吗?

关于c# - 我如何对 ObservableCollection<T> 进行排序,以便我的 UI 也能看到排序过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4906239/

相关文章:

c# - 为什么 C# 三元运算符需要强制转换,而等效的 if() 语句不需要?

silverlight-4.0 - Sl 4, MVVM : Using Inlines in a TextBlock, 如何绑定(bind)到ViewModel?

silverlight - 以编程方式为 Silverlight ComboBox 创建 ItemsPanelTemplate?

wpf - WCF RIA 的 EntityFramework 的 HasChanges

c# - 如何为用户定义的按钮创建具有已知且固定值的属性?

c# - 我应该如何解决我在 C# 中的方法访问安全性?

c# - 桌面应用程序的推送通知

c# - 如何旋转二维向量?

silverlight-4.0 - 在 “system.runtime.serialization.iextensibledataobject”上编译错误

silverlight - Silverlight 4 OOB 应用程序中并不总是引发 MainWindow.Closing 事件