我正在使用WPF DataGrid,它将一组导入的文件呈现给程序。 一切正常但我在单击 标题时排序文件大小时遇到问题 !
正常排序方法无法区分 12 * GB 和 12 * MB ,因此它们彼此相邻,这正是我不想发生的事情。
知道如何解决这个问题吗?
→通过添加长列来解决问题,即使尺寸可能看起来也是如此 没有意义我别无选择!
答案 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'方法;它永远不会被调用)。
根据我的经验,将非字符串数据存储为字符串几乎总是错误的做法,正是出于这种原因。最好把它留作它真正的任何类型的数据,并找到一种方法来“在最后一刻”格式化它。