天天看點

清單ListBox、ListView、GridView 排序

清單排序

1.使用控件預設排序方式(推薦)

ListControl.Items.SortDescriptions.Clear();
    ListControl.Items.SortDescriptions.Add(new SortDescription("IsGroup", ListSortDirection.Descending));
    ListControl.Items.SortDescriptions.Add(new SortDescription(_sortingField?? "UpdateTime", _sortingDirection));
    ListControl.Items.Refresh();      

2.使用CollectionView排序

var collectionView = CollectionViewSource.GetDefaultView(ListControl.ItemsSource);
if (collectionView != null)
{
    collectionView.SortDescriptions.Clear();
    collectionView.SortDescriptions.Add(new SortDescription("IsGroup", ListSortDirection.Descending));
    collectionView.SortDescriptions.Add(new SortDescription(_sortingField, sortingDirection));
    collectionView.Refresh();
}      

2.自定義SortableObservableCollection

public class SortableObservableCollection<T> : ObservableCollection<T>
    {
        public SortableObservableCollection()
        {
        }

        public SortableObservableCollection(List<T> list)
            : base(list)
        {
        }

        public SortableObservableCollection(IEnumerable<T> collection)
            : base(collection)
        {
        }

        public void Sort<TKey>(Func<T, TKey> keySelector, System.ComponentModel.ListSortDirection direction)
        {
            switch (direction)
            {
                case System.ComponentModel.ListSortDirection.Ascending:
                {
                    ApplySort(Items.OrderBy(keySelector));
                    break;
                }
                case System.ComponentModel.ListSortDirection.Descending:
                {
                    ApplySort(Items.OrderByDescending(keySelector));
                    break;
                }
            }
        }

        public void Sort<TKey>(Func<T, TKey> keySelector, IComparer<TKey> comparer)
        {
            ApplySort(Items.OrderBy(keySelector, comparer));
        }

        private void ApplySort(IEnumerable<T> sortedItems)
        {
            var sortedItemsList = sortedItems.ToList();

            foreach (var item in sortedItemsList)
            {
                Move(IndexOf(item), sortedItemsList.IndexOf(item));
            }
        }
    }      

添加清單屬性,并綁定到控件

public SortableObservableCollection<CoursewareListItem> Items
        {
            get { return _items; }
            set
            {
                _items = value;
                RaisePropertyChanged("Items");
            }
        }      

在排序觸發時,添加

viewModel.Items.Sort(item => item.UpdateTime, sortingDirection);

值得注意的是:異步線程高度目前主UI線程時,ObservableCollection清單是不支援重新排序的。

關鍵字:清單排序,CollectionViewSource,ObservableCollection,異步線程對清單排序

作者:

唐宋元明清2188

出處:

http://www.cnblogs.com/kybs0/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連接配接,否則保留追究法律責任的權利。