我有一个类似这样的列表框:
ListBox.Items.SortDescriptions.Add(new SortDescription("Order", ListSortDirection.Descending));
但它按字母顺序排序,而不是数值!怎么做?
顺便说一句 - 属性(又名列)在数据库中存储为 varchar,属性是字符串。但不知何故,我想将其转换为整数。我尝试使用另一个属性,它是一个整数,我根本无法对其进行排序!它抛出了一个异常!
如果这是您要在该控件内进行的所有排序,那么一个不错的选择是设置ListCollectionView.CustomSort
为IComparer
执行自然排序的实例。这会将实现与您的项目的类型结合起来ListView
,但如果该类型不会经常更改,这是一个合理的限制。另一方面,排序会快得多,因为它不需要涉及反射。
假设你有这样一个比较器:
var comparer = new ...
那么您需要做的就是安装它:
var view = (ListCollectionView)
CollectionViewSource.GetDefaultView(ListBox.ItemsSource);
view.CustomSort = comparer;
这很容易。所以现在我们只需要找出comparer
看起来像什么......这是一个很好的答案,展示了如何实现这样的比较器:
[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
public static extern int StrCmpLogicalW(string psz1, string psz2);
}
public sealed class NaturalOrderComparer : IComparer
{
public int Compare(object a, object b)
{
// replace DataItem with the actual class of the items in the ListView
var lhs = (DataItem)a;
var rhs = (DataItem)b;
return SafeNativeMethods.StrCmpLogicalW(lhs.Order, rhs.Order);
}
}
因此,鉴于上面的比较器,您应该会发现一切都可以使用
var view = (ListCollectionView)
CollectionViewSource.GetDefaultView(ListBox.ItemsSource);
view.CustomSort = new NaturalOrderComparer();