Числовая сортировка строк в списке - PullRequest
1 голос
/ 10 декабря 2011

У меня есть ListBox, который ItemSource связан с CollectionViewSource. Источник CVS - XmlDataProvider. Таким образом, ListBox перечисляет все узлы (атрибут name), которые я указал. Теперь эти узлы имеют атрибуты, и я хочу, чтобы ListBox сортировался по ним. Проблема в том, что лежащие в основе данные представляют собой xml, каждое значение (атрибуты узла) является строкой, но некоторые значения представляют собой числовые значения. Поскольку сортировка с помощью CollectionViewSource.SortDescriptions.add (...) будет сортировать эти (строковые) значения в алфавитном порядке, последовательность из 2,10,5 будет отсортирована как 10,2,5 вместо 2,5,10. Как я могу решить это?

Если решение лежит в пользовательской сортировке ListView, может кто-нибудь дать мне быстрый пример того, как это сделать с помощью базового XmlDocument?

Я думал, что это будет так же просто, как написать класс, который реализует IComparer, но почему-то я заблудился. Я хотел передать имя атрибута методу, чтобы я мог просто «извлечь» все эти атрибуты из CVS, преобразовать их в float (в данном случае) и отсортировать их стандартными функциями ... Но я совершенно заблудился от того, как работает эта CustomSort, чтобы быть честным ....

Надеюсь, что это возможно, не отказываясь от XmlDocument, потому что это отчасти дано:)

Привет

1 Ответ

2 голосов
/ 10 декабря 2011

Если вы связываетесь с коллекцией, которая наследуется от IList, вы можете получить ListCollectionView из свойства ItemsSource вашего элемента управления ListView. Получив экземпляр ListCollectionView, вы можете назначить метод сортировки свойству CustomSorter.

Пользовательский сортировщик должен наследовать от старого стиля, не являющегося универсальным IComparer. В методе Compare вы получаете два экземпляра связанного класса. Вы можете разыграть их по мере необходимости, чтобы получить желаемый результат. Во время разработки вы можете закрепить отладчик внутри метода Compare, чтобы точно определить, что это за объекты.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        List<string> strings = new List<string>() { "3", "2", "10", "1" };
        lv1.ItemsSource = strings;
        ListCollectionView lcv = 
             CollectionViewSource.GetDefaultView(lv1.ItemsSource) as ListCollectionView;
        if(lcv!=null)
        {
            lcv.CustomSort = new MySorter();
        }
    }
}
public class MySorter : IComparer
{
    public int Compare(object x, object y)
    { // set break point here!
        return Convert.ToInt32(x) - Convert.ToInt32(y);
    }
}
...