2012-05-14 3 views
0

У меня есть ListBox, который имеет вид, как это:Как сортировать по целому числу в списке в коллекции WPF?

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

Но он сортирует по алфавиту, а не числовые значения! Как это сделать?

Кстати, свойство (aka column) хранится как varchar в базе данных, а свойство - это строка. Но каким-то образом я хотел бы преобразовать его в целое число. И я попробовал другое свойство, и это было целое число, и я не мог его сортировать вообще! Это исключение!

+0

Что входит в ваш список? –

+0

Вы заполняете список вручную или привязываетесь к источнику данных? – Jon

+0

привязка к источнику данных – marko

ответ

2

Если это вся сортировка, которую вы собираетесь делать внутри этого элемента управления, хорошим вариантом было бы установить 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(); 
Смежные вопросы