1

次のようなコードがあります。

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

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

グループの並べ替えを保持したいが、ユーザーの並べ替えを許可したい。ユーザーの並べ替えは、基本的に二次的な並べ替えになると思います。つまり、これが必要です: ORDER BY GenericStatus DESC, UsersColumnOfChoise ASC/DESC

4

2 に答える 2

3

私は自分でこの問題に遭遇しました。私の解決策は、Sorting イベントをインターセプトし、DataGrid に依存して処理するのではなく、ViewModel で ICollectionView に並べ替えを実行させることでした。

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
}

ビューモデル:

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();
    }
}
于 2012-04-28T17:11:36.953 に答える
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;
    }
}

各列ヘッダーには、ユーザーがクリックしてソートしたときに呼び出される Command が関連付けられています。

var h = new GridViewColumnHeader();
h.Command = sortList;
h.CommandParameter = "deviceName";
于 2012-04-27T15:40:14.763 に答える