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