0

次のような並べ替えのリストボックスがあります。

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

ただし、数値ではなくアルファベット順にソートされます。どうやってするか?

ところで、プロパティ (別名カラム) はデータベースに varchar として格納され、プロパティは文字列です。しかし、どういうわけか私はそれを整数に変換したいと思います。そして、別のプロパティを試してみましたが、それは整数で、まったく並べ替えることができませんでした! 例外がスローされました!

4

1 に答える 1

2

これがそのコントロール内で実行するすべての並べ替えである場合、適切なオプションは、自然な並べ替え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();
于 2012-05-14T14:52:18.930 に答える