BindingList<T>.Sort() de se comporter comme une Liste<T>.Sort()

J'essaie d'écrire un SortableBindingList que je peux utiliser pour mon application. J'ai trouvé beaucoup de discussion au sujet de comment implémenter la base de tri de soutien de sorte que la BindingList va trier utilisée dans le contexte d'un DataGridView ou une autre de contrôle lié, y compris ce post de StackOverflow:

DataGridView de tri et, par exemple, BindingList<T> dans .NET

Tout cela est très utile et j'ai mis en place le code, testé, etc. et ça fonctionne, mais dans mon cas en particulier, j'ai besoin d'être en mesure de soutenir un simple appel à Trier() et que l'appel utilisez la valeur par défaut IComparable.CompareTo() de faire le tri, plutôt que de faire un appel à ApplySortCore(PropertyDescriptor, ListSortDirection).

La raison en est parce que j'ai une assez grande quantité de code qui, selon la Tri() appel, car cette classe particulière à l'origine héréditaire de la Liste et a récemment été modifié pour être une BindingList.

Donc, précisément, j'ai une classe appelée VariableCode et une classe de collection appelée VariableCodeList. VariableCode implémente IComparable et la logique y est moyennement complexe, fondée sur plusieurs propriétés, etc...

public class VariableCode : ...  IComparable ...
{
    public int CompareTo(object p_Target)
    {
        int output = 0;
        //some interesting stuff here
        return output;
    }
}

public class VariableCodeList : SortableBindingList<VariableCode>
{
    public void Sort()
    {
        //This is where I need help
        // How do I sort this list using the IComparable
        // logic from the class above?
    }
}

J'ai fait quelques tentatives ont échoué à la réattribution de la ApplySortCore à la méthode Sort(), mais ce qui tient à contrecarrer moi, c'est que le ApplySortCore s'attend à un PropertyDescriptor de faire son tri et je ne peux pas comprendre comment obtenir que l'utilisation de la IComparable.CompareTo() de la logique.

Quelqu'un peut me pointer dans la bonne direction?

Merci beaucoup.


EDIT: C'est le dernier code sur la base de Marc de réponse pour référence future.

  ///<summary>
///Sorts using the default IComparer of T
///</summary>
public void Sort()
{
sort(null, null);
}
public void Sort(IComparer<T> p_Comparer)
{
sort(p_Comparer, null);
}
public void Sort(Comparison<T> p_Comparison)
{
sort(null, p_Comparison);
}
private void sort(IComparer<T> p_Comparer, Comparison<T> p_Comparison)
{
m_SortProperty = null;
m_SortDirection = ListSortDirection.Ascending;
//Extract items and sort separately
List<T> sortList = new List<T>();
this.ForEach(item => sortList.Add(item));//Extension method for this call
if (p_Comparison == null)
{
sortList.Sort(p_Comparer);
}//if
else
{
sortList.Sort(p_Comparison);
}//else
//Disable notifications, rebuild, and re-enable notifications
bool oldRaise = RaiseListChangedEvents;
RaiseListChangedEvents = false;
try
{
ClearItems();
sortList.ForEach(item => this.Add(item));
}
finally
{
RaiseListChangedEvents = oldRaise;
ResetBindings();
}
}
InformationsquelleAutor Paul Prewett | 2009-06-30