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

C# 如何以排序方式显示int的数据绑定集合,c#,wpf,data-binding,itemscontrol,C#,Wpf,Data Binding,Itemscontrol,我有一个非常小的int集合,我正在自定义ItemsControl中显示这些int。我不担心性能,因为收藏太少了。我希望项目以升序显示,但无法找到最佳方式。我已经成功地使用了带有sortddescription的CollectionViewSource对更复杂的对象进行排序,但它似乎需要一个属性名来进行排序。我意识到我可以对底层集合进行排序,或者将我的int封装在引用类型中,以使用sortddescription,但这两种方法似乎都有些过分。我错过什么了吗 我想做这样的事情,MyCollectio

我有一个非常小的int集合,我正在自定义
ItemsControl
中显示这些int。我不担心性能,因为收藏太少了。我希望项目以升序显示,但无法找到最佳方式。我已经成功地使用了带有
sortddescription
CollectionViewSource
对更复杂的对象进行排序,但它似乎需要一个属性名来进行排序。我意识到我可以对底层集合进行排序,或者将我的int封装在引用类型中,以使用
sortddescription
,但这两种方法似乎都有些过分。我错过什么了吗

我想做这样的事情,
MyCollection
属于
ObservableCollection


...

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

诚然,没有内置的方法来对
可观测集合进行排序,但实现起来并不困难。下面是一个快速排序实现,您可以将其用作实现IList的任何类的扩展方法:


只需使用
作为属性名称:

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

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;
    }

}
var view = CollectionViewSource.GetDefaultView(MyCollection);
using (view.DeferRefresh())
{
    MyCollection.QuickSort();
}
<scm:SortDescription Direction="Ascending" PropertyName="." />