WPF DataGrid标头文件大小排序

时间:2011-06-19 05:24:35

标签: c# wpf sorting datagrid header

我正在使用WPF DataGrid,它将一组导入的文件呈现给程序。 一切正常但我在单击 标题时排序文件大小时遇到​​问题

正常排序方法无法区分 12 * GB 12 * MB ,因此它们彼此相邻,这正是我不想发生的事情。

知道如何解决这个问题吗?

  

→通过添加长列来解决问题,即使尺寸可能看起来也是如此   没有意义我别无选择!

3 个答案:

答案 0 :(得分:1)

我不认为正常的字符串排序在这种情况下会起作用。您必须实现自定义排序。

检查此link以了解如何在DataGrid中实现自定义排序。它还提高了DataGrid中的排序性能。

你必须处理DataGrid的排序事件。

dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler);

然后在事件处理程序中你会做这样的事情(取自here

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;
}

答案 1 :(得分:1)

首先,您需要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。以下Stack Overflow答案完美地解释了它:

您只需挂钩DataGrid.Sorting事件,然后将比较器与您列的ListCollectionView相关联。

答案 2 :(得分:1)

您可能想尝试不同的方法:不是将数据格式化为网格格式,然后面对字符串排序问题,而是将数据保留为数字并使用自定义列格式化例程来呈现大小MB,GB等。

基本上你需要从IValueConverter派生一个类并让它进行格式化(不要担心'ConvertBack'方法;它永远不会被调用)。

根据我的经验,将非字符串数据存储为字符串几乎总是错误的做法,正是出于这种原因。最好把它留作它真正的任何类型的数据,并找到一种方法来“在最后一刻”格式化它。