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