WPF DataGrid Заголовок Размер файла - PullRequest
2 голосов
/ 19 июня 2011

Я работаю с WPF DataGrid, который представляет набор импортированных файлов в программу.Все работает нормально, но я столкнулся с проблемой сортировки размеров файлов при щелчке по заголовку !

Обычный метод сортировки не может различать 12 * ГБ и 12 * MB , поэтому они появляются рядом друг с другом, и это именно то, чего я не хочу, чтобы это произошло.

Есть идеи, как решить эту проблему?

→ Решил проблему, добавив длинный столбец, хотя размеры могут показаться бессмысленными. У меня не было выбора!

Ответы [ 3 ]

1 голос
/ 19 июня 2011

Сначала вам нужен IComparer<string>, который выполняет сортировку с учетом суффикса.Я уверен, что вы можете написать свой собственный, но вот быстрый и грязный подход, который только обрабатывает перечисленные вами случаи:

public class FileSizeComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        var xFields = x.Split('*');
        var yFields = y.Split('*');
        if (xFields[1] == "GB" && yFields[0] == "MB") return 1;
        if (xFields[1] == "MB" && yFields[0] == "GB") return -1;
        return int.Parse(yFields[0]) - int.Parse(xFields[0]);
    }
}

Это можно сделать на лот более эффективным, еслиВы сортируете много тысяч строк.

Затем вам нужно подключить ваш компаратор к DataGrid.Следующий ответ о переполнении стека объясняет это прекрасно:

Вы просто подключаетеDataGrid.Sorting событие и подключите ваш компаратор к ListCollectionView для вашего столбца.

1 голос
/ 14 июля 2011

Возможно, вы захотите попробовать другой подход: вместо того, чтобы форматировать данные в сетке в виде строк, а затем столкнуться с проблемой сортировки строк, оставьте данные в виде числа и используйте специальную процедуру форматирования столбцов для визуализации размера с МБ, ГБ и т. Д. По желанию.

Обычно вам нужно извлечь класс из IValueConverter и позволить ему выполнить форматирование (не беспокойтесь о методе ConvertBack; он никогда не будет вызываться).

По моему опыту, хранение нестроковых данных в виде строк - почти всегда неправильное решение именно по такой причине. Лучше оставить это как любой тип данных и найти способ отформатировать его «в последнюю минуту».

1 голос
/ 19 июня 2011

Не думаю, что в этом случае будет работать обычная сортировка строк. Вам нужно будет выполнить пользовательскую сортировку.

Проверьте эту ссылку , чтобы узнать, как реализовать пользовательскую сортировку в DataGrid. Это также повышает производительность сортировки в DataGrid.

вам придется обработать событие сортировки DataGrid.

dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler);

Тогда внутри обработчика событий вы будете делать что-то вроде этого (взято из здесь )

void SortHandler(object sender, DataGridSortingEventArgs e) 
{
     DataGridColumn column = e.Column;

     IComparer comparer = null;

     //i do some custom checking based on column to get the right comparer
     //i have different comparers for different columns. I also handle the sort direction
     //in my comparer

     // prevent the built-in sort from sorting
     e.Handled = true;

    ListSortDirection direction = (column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending;

    //set the sort order on the column
    column.SortDirection = direction;

    //use a ListCollectionView to do the sort.
    ListCollectionView lcv = (ListCollectionView)CollectionViewSource.GetDefaultView(this.ItemsSource);

    //this is my custom sorter it just derives from IComparer and has a few properties
    //you could just apply the comparer but i needed to do a few extra bits and pieces
    comparer = new ResultSort(direction);
    //apply the sort
    lcv.CustomSort = comparer;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...