Если это вся сортировка, которую вы собираетесь делать внутри этого элемента управления, хорошим вариантом было бы установить ListCollectionView.CustomSort
в экземпляр IComparer
, который выполняет естественную сортировку. Это свяжет реализацию с типом элементов в вашем ListView
, но если этот тип не будет меняться очень часто, это разумное ограничение. С другой стороны, сортировка будет намного быстрее, потому что ей не нужно включать отражение.
Если у вас есть такой компаратор:
var comparer = new ...
то все, что вам нужно сделать, это установить его:
var view = (ListCollectionView)
CollectionViewSource.GetDefaultView(ListBox.ItemsSource);
view.CustomSort = comparer;
Это легко. Так что теперь у нас есть только выяснить, что comparer
выглядит ... Вот very good answer, показывающий, как реализовать такой компаратор:
[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();
Что входит в ваш список? –
Вы заполняете список вручную или привязываетесь к источнику данных? – Jon
привязка к источнику данных – marko