如何以排序方式显示int的数据绑定集合

时间:2012-11-19 21:32:15

标签: c# wpf data-binding itemscontrol

我在自定义ItemsControl中显示了一小部分整数。我不担心性能,因为这个系列太小了。我希望这些项目按升序显示,并且无法找出最佳方法。我已成功使用带有CollectionViewSource的{​​{1}}来排序更复杂的对象,但似乎需要使用属性名称进行排序。我意识到我可以保持底层集合的排序或将我的int包装在引用类型中以使用SortDescription,但两者似乎都有点过分。我错过了什么吗?

我想做类似的事情,其中​​SortDescription的类型为MyCollection

ObservableCollection<int>

2 个答案:

答案 0 :(得分:2)

只需使用.作为属性名称:

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

答案 1 :(得分:0)

您可以对源集合(MyCollection)进行排序,而不是在XAML中对其进行排序。

不可否认,没有内置的方法来对ObservableCollection<T>进行排序,但实施起来并不是很难。这是一个QuickSort实现,您可以在任何实现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();
}