2012-04-27 17 views
1

は、私はこのようなコードを持っている:WPFでDataGridグループの順序を強制するには?

StatusItems = new ObservableCollection<StatusItem> { }; 
StatusItemsGrouped = new ListCollectionView(StatusItems); 
StatusItemsGrouped.GroupDescriptions.Add(new PropertyGroupDescription("GenericStatus")); 
StatusItemsGrouped.SortDescriptions.Add(new SortDescription("GenericStatus", ListSortDirection.Descending)); 

基本的に私はGenericStatusと呼ばれる情報に基づいてDataGrid上のデータをグループ化しています。並べ替え以外はすべて問題ありません。ここで達成したいのは、グループを降順で並べ替えることです(私のコードのように)。しかし、上記のコードの問題は、ユーザーがある列をクリックすると並べ替えが壊れてしまうことです。

私はグループソートを維持したいと考えていますが、のユーザーソートを許可します。ユーザーの並べ替えは、基本的には二次的な並べ替えになります。つまり、これは欲しいです:ORDER BY GenericStatus DESC, UsersColumnOfChoise ASC/DESC

答えて

1

「コマンド」として各列のクリックを設定してから、実行するコマンドを監視し、GenericStatusに加えてソートされた列として追加することもできます。

CommandStubを作成します。

private bool sortAscending; 
private CommandStub _sortList; 
public ICommand sortList { 
    get { 
     if (_sortList == null) { 
      _sortList = new CommandStub(); 
      _sortList.OnExecuting += new CommandStub.ExecutingEventHandler(_sortList_OnExecuting); 
     } 

     return _sortList; 
    } 
} 

void _sortList_OnExecuting(object parameter) { 

    var sortColumn = (string)parameter; 
    StatusItems.SortDescriptions.Clear(); 

    if (sortAscending) { 
     // Always sort first by GenericStatus 
     StatusItems.SortDescriptions.Add(new SortDescription("GenericStatus", ListSortDirection.Ascending)); 

     // Sort by the column clicked 
     StatusItems.SortDescriptions.Add(new SortDescription(sortColumn, ListSortDirection.Ascending)); 
     this.sortAscending = false; 
    } else { 
     // Always sort first by GenericStatus 
     StatusItems.SortDescriptions.Add(new SortDescription("GenericStatus", ListSortDirection.Descending)); 

     StatusItems.SortDescriptions.Add(new SortDescription(sortColumn, ListSortDirection.Descending)); 
     this.sortAscending = true; 
    } 
} 

各列ヘッダは、ユーザがソートするためにクリックしたときに呼び出され、それに関連するコマンドがあります。

var h = new GridViewColumnHeader(); 
h.Command = sortList; 
h.CommandParameter = "deviceName"; 
2

私はこの問題に自分自身を走ったと私解決策はソートイベントをインターセプトして、ICollectionViewでDataGridを使用して処理する代わりにViewModelでソートを実行させることでした。

XAML:

<DataGrid ItemsSource="{Binding StatusItemsGrouped}" Sorting="OnSorting_"/> 

XAML.CS:

private void OnSorting_(object sender, DataGridSortingEventArgs e) 
{ 
    var viewModel = DataContext as ViewModel; 
    e.Handled = true;         // prevent DataGrid from sorting 
    viewModel.SortItemSource(e.Column);    // perform sorting 
    e.Column.SortDirection = viewModel.SortDirection; // set sort direction icon on column header 
} 

のViewModel:

public class ViewModel 
{ 
    public ListCollectionView StatusItemsGrouped { get; set; } 
    public ListSortDirection SortDirection { get; set; } 
    public string SortColumn { get; set; } 

    public void SortItemSource(string columnName) 
    { 
     if (String.Compare(SortColumn, columnName, true) == 0) 
      SortDirection = ListSortDirection.Ascending; 
     else 
      SortDirection = ListSortDirection.Descending; 
     SortColumn = columnName; 
     using(StatusItemsGrouped.DeferRefresh()) { 
      StatusItemsGrouped.GroupDescriptions.Clear(); 
      StatusItemsGrouped.SortDescriptions.Clear(); 
      StatusItemsGrouped.SortDescriptions.Add(new SortDescription(SortColumn, SortDirection)); 
      StatusItemsGrouped.GroupDescriptions.Add(new PropertyGroupDescription("GenericStatus")); 
     } 
     StatusItemsGrouped.Refresh(); 
    } 
} 
+0

優れた答え。私はそれを私の使用のために大きく変更しましたが、それは私を解決に導きます。ありがとうございました! –

関連する問題