/ / ¿Cómo ordenar por entero en un listitemcollection en WPF? - c #, wpf

¿Cómo ordenar por entero en un listitemcollection en WPF? - c #, wpf

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 № 1

Si 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();