0

我有一个类似这样的列表框:

ListBox.Items.SortDescriptions.Add(new SortDescription("Order", ListSortDirection.Descending));

但它按字母顺序排序,而不是数值!怎么做?

顺便说一句 - 属性(又名列)在数据库中存储为 varchar,属性是字符串。但不知何故,我想将其转换为整数。我尝试使用另一个属性,它是一个整数,我根本无法对其进行排序!它抛出了一个异常!

4

1 回答 1

2

如果这是您要在该控件内进行的所有排序,那么一个不错的选择是设置ListCollectionView.CustomSortIComparer执行自然排序的实例。这会将实现与您的项目的类型结合起来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();
于 2012-05-14T14:52:18.930 回答