2011-06-19 19 views
2

私はプログラムにインポートされたファイルのセットを提示するWPF DataGridで作業しています。 すべて正常に動作しますが、ヘッダーをクリックしたときに問題が発生しました。WPF DataGridヘッダーファイルサイズの並べ替え

通常のソート方法が * GBと12 * MB 12 の間を区別することはできませんので、彼らは隣同士に表示され、それは私が起こることを望んでいない、まさにです。

どのようにこの問題を解決するためのアイデアですか?

→大きさが見えていても、長い列を追加することで問題を解決 私は選択の余地がなかった無意味!

答えて

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に接続する必要があります。以下のスタックオーバーフローの答えは完全にそれを説明する:あなたは自分の列にListCollectionViewからDataGrid.Sortingイベントやワイヤーアップあなたの比較子をフック

1

この場合、通常の文字列の並べ替えが機能するとは思われません。カスタムソートを実装する必要があります。

DataGridでカスタムソートを実装する方法については、linkを確認してください。また、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

データをグリッドに文字列として書式設定し、文字列ソートの問題に直面する代わりに、データを数値のままにして、カスタムの列書式設定ルーチンを使用してサイズをレンダリングすることもできます必要に応じてMB、GBなどで置き換えます。

基本的には、IValueConverterからクラスを派生させ、フォーマットを実行させる必要があります(ConvertBackメソッドは心配しないでください)。

私の経験では、文字列以外のデータを文字列として格納することは、この種の理由から、ほとんど常に間違ったことです。それは本当にどんなタイプのデータでも残しておき、それを "最後の時"にフォーマットする方法を見つける方が良いでしょう。

関連する問題