2012-11-19 17 views
3

我有一個很小的int集合,我在自定義ItemsControl中顯示。由於收藏品太小,我並不擔心表演。我希望項目按升序顯示,但無法找出最佳方式。我已成功使用CollectionViewSourceSortDescription來排序更復雜的對象,但它似乎需要屬性名稱進行排序。我意識到我可以保留下面的集合排序或將我的整數包含在引用類型中以使用SortDescription,但兩者看起來都過分。我錯過了什麼嗎?如何以排序的方式顯示int的數據綁定集合

我想要做這樣的事情,在這裏MyCollection類型爲ObservableCollection<int>

<Grid.Resources> 
    <CollectionViewSource x:Key={sortedView} Source={Binding MyCollection}> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription Direction="Ascending" PropertyName="???" /> 
     </CollectionViewSource.SortDescriptions> 
    <CollectionViewSource> 
<Grid.Resources> 

... 

<ItemsControl ItemsSource={StaticResource sortedView} /> 

回答

2

只需使用.作爲屬性名稱:

<scm:SortDescription Direction="Ascending" PropertyName="." /> 
+0

正是我一直在尋找,謝謝! – zmb

0

你可以排序的源集合(MyCollection),而不是對其進行排序的XAML。

無可否認,沒有內置的方法來排序ObservableCollection<T>,但實現起來並不困難。這裏是你可以實現IList<T>任何類作爲擴展方法使用一個快速排序的實現:

static class QuickSortExtensions 
{ 
    private static void CheckArgumentNull<T>(this T arg, string paramName) where T : class 
    { 
     if (arg == null) 
      throw new ArgumentNullException(paramName); 
    } 

    public static void CheckArgumentOutOfRange<T>(
     this T value, 
     string paramName, 
     T min, 
     T max) 
     where T : IComparable<T> 
    { 
     if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) 
      throw new ArgumentOutOfRangeException(paramName); 
    } 

    public static void QuickSort<T>(this IList<T> list) 
    { 
     Comparison<T> comparison = Comparer<T>.Default.Compare; 
     list.QuickSort(comparison); 
    } 

    public static void QuickSort<T>(
     this IList<T> list, 
     IComparer<T> comparer) 
    { 
     comparer = comparer ?? Comparer<T>.Default; 
     list.QuickSort(comparer.Compare); 
    } 

    public static void QuickSort<T>(
     this IList<T> list, 
     Comparison<T> comparison) 
    { 
     list.CheckArgumentNull("list"); 
     comparison.CheckArgumentNull("comparison"); 
     QuickSort(list, 0, list.Count - 1, comparison); 
    } 

    private static void QuickSort<T>(IList<T> list, int left, int right, Comparison<T> comparison) 
    { 
     if (right > left) 
     { 
      int pivot = left; 
      QuickSortPartition(list, left, right, ref pivot, comparison); 
      QuickSort(list, left, pivot - 1, comparison); 
      QuickSort(list, pivot + 1, right, comparison); 
     } 
    } 

    private static void QuickSortPartition<T>(IList<T> list, int left, int right, ref int pivot, Comparison<T> comparison) 
    { 
     T pivotValue = list[pivot]; 
     list.Swap(pivot, right); 
     int tmpIndex = left; 
     for (int i = left; i < right; i++) 
     { 
      if (comparison(list[i], pivotValue) <= 0) 
      { 
       list.Swap(i, tmpIndex); 
       tmpIndex++; 
      } 
     } 
     list.Swap(tmpIndex, right); 
     pivot = tmpIndex; 
    } 

    private static void Swap<T>(
     this IList<T> list, 
     int index1, 
     int index2) 
    { 
     list.CheckArgumentNull("list"); 
     index1.CheckArgumentOutOfRange("index1", 0, list.Count - 1); 
     index1.CheckArgumentOutOfRange("index2", 0, list.Count - 1); 

     T tmp = list[index1]; 
     list[index1] = list[index2]; 
     list[index2] = tmp; 
    } 

} 

爲了防止排序期間刷新視圖作爲收集物品搬來搬去,你可以使用DeferRefresh

var view = CollectionViewSource.GetDefaultView(MyCollection); 
using (view.DeferRefresh()) 
{ 
    MyCollection.QuickSort(); 
} 
相關問題