Tengo un listbox que tiene un tipo como este:
ListBox.Items.SortDescriptions.Add(new SortDescription("Order", ListSortDirection.Descending));
¡Pero ordena alfabéticamente, no valores numéricos! ¿Como hacer eso?
Por cierto, la propiedad (columna aka) se almacenacomo varchar en la base de datos y la propiedad es una cadena. Pero de alguna manera me gustaría convertirlo a un número entero. ¡Y probé con otra propiedad y era un número entero y no pude ordenarlo en absoluto! ¡Lanzó una excepción!
Respuestas
2 para la respuesta № 1Si esta es toda la clasificación que va a hacer dentro de ese control, una buena opción sería establecer ListCollectionView.CustomSort
a una IComparer
ejemplo que hace la clasificación natural. Esto relacionará la implementación con el tipo de ítems en su ListView
, pero si ese tipo no va a cambiar muy a menudo, esta es una limitación razonable. Por otro lado, el género será mucho más rápido porque no necesitará involucrar la reflexión.
Suponiendo que tenga un comparador de este tipo:
var comparer = new ...
entonces todo lo que necesita hacer es instalarlo:
var view = (ListCollectionView)
CollectionViewSource.GetDefaultView(ListBox.ItemsSource);
view.CustomSort = comparer;
Eso es fácil. Ahora solo tenemos que descubrir qué comparer
parece ... Aquí hay una muy buena respuesta que muestra cómo implementar dicho comparador:
[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);
}
}
Entonces, dado el comparador anterior, debe encontrar todo lo que funcione con
var view = (ListCollectionView)
CollectionViewSource.GetDefaultView(ListBox.ItemsSource);
view.CustomSort = new NaturalOrderComparer();