ユーザーがDataGrid
で列の並べ替えを行う場合、すべてのnullまたは空のセルを上ではなく下に並べ替えます。
私は空白が常に下にソートされることを確認する_IComparer<T>
_を書きましたが、それをDataGrid
の列に適用する方法がわかりません。 LINQ OrderBy()
メソッドで実行しているDataGrid
のinitialソートが機能することに注意してくださいすごい。問題は、ユーザーが実行するすべての後続の並べ替えで、空白が一番上に並べ替えられることです。
比較コード
_public class BlankLastStringComparer : IComparer<string>
{
public int Compare(string x, string y)
{
if (string.IsNullOrEmpty(x) && !string.IsNullOrEmpty(y))
return 1;
else if (!string.IsNullOrEmpty(x) && string.IsNullOrEmpty(y))
return -1;
else
return string.Compare(x, y);
}
}
_
質問
DataGridColumn
でコンパレータを使用するにはどうすればよいですか?または、これが不可能な場合は、回避策を提供できますか?できれば、MVVMフレンドリーなソリューションを期待しています。
これは私がそれを行う方法です:私はこれをすべてクラス内に保つためにグリッドから派生するので、内部でイベントハンドラーにアタッチします
並べ替えイベントに添付する
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;
}
アタッチされた動作を利用するこの問題のMVVMソリューションがあります。コードビハインドを使用したい場合は、@ Aranのソリューションも有効です。