1

私のデータグリッドは次のように設定されています。

  • ObservableCollectionにバインドされたItemsSource
  • 並べ替えイベントの処理
    • e.Handled = true;
    • 明確な観察可能なコレクション
    • ソートロジックを備えたクエリデータベース
    • Foreachの結果を監視可能なコレクションに追加

これはうまく機能しますが、複数列の並べ替えを有効にしたいです。列見出しをクリックしながらShiftキーを押したままにすることが、エンドユーザーがこれを行う方法であると私は理解しています。しかし、並べ替えイベントでは、並べ替えの説明を取得する方法がわかりません。

これが、単一列のサーバー側の並べ替えのコードです。これは正常に機能します。

public class DataGrid : System.Windows.Controls.DataGrid
{
    public event EventHandler<SortExpressionConstructedEventArgs> SortExpressionConstructed;

    public void OnSortExpressionConstructed(SortExpressionConstructedEventArgs e)
    {
        EventHandler<SortExpressionConstructedEventArgs> handler = SortExpressionConstructed;
        if (handler != null) handler(this, e);
    }


    public DataGrid()
    {
        Sorting += DataGridSorting;
    }

    void DataGridSorting(object sender, System.Windows.Controls.DataGridSortingEventArgs e)
    {
        e.Handled = true;
        e.Column.SortDirection = e.Column.SortDirection != ListSortDirection.Ascending
                                     ? ListSortDirection.Ascending
                                     : ListSortDirection.Descending;

        var sd = new SortDescription(e.Column.SortMemberPath, e.Column.SortDirection.Value);
        OnSortExpressionConstructed(new SortExpressionConstructedEventArgs(sd));
    }
}

public class SortExpressionConstructedEventArgs : EventArgs
{
    public SortExpressionConstructedEventArgs(SortDescription sortDescription)
    {
        SortDescription = sortDescription;
    }

    public SortDescription SortDescription { get; private set; }

    // event handler can use this to sort the query
    public IOrderedQueryable<T> Order<T>(IQueryable<T> queryable)
    {
        switch (SortDescription.Direction)
        {
            case ListSortDirection.Ascending:
                return enumerable.OrderBy(SortDescription.PropertyName);

            case ListSortDirection.Descending:
                return enumerable.OrderByDescending(SortDescription.PropertyName);

            default:
                throw new ArgumentOutOfRangeException();
        }
    }
}
4

2 に答える 2

1

私の解決策は、派生した DataGrid クラスで並べ替えられた列を手動で追跡することでした。これはうまく機能しています。

https://github.com/ronnieoverby/RonnieOverbyGrabBag/blob/master/DataGrid.cs

于 2012-08-30T19:56:53.533 に答える
0

私の方法は私にとってはうまくいきます。このコードを試してみてください。

if (dgEvents.ItemsSource == null)
    dgEvents.ItemsSource = events.Entries;

CollectionViewSource.GetDefaultView(dgEvents.ItemsSource).Refresh();

dgEvents.Items.SortDescriptions.Clear();

dgEvents.Items.SortDescriptions.Add(new SortDescription(dgEvents.Columns[0].SortMemberPath, ListSortDirection.Descending));


foreach (var col in dgEvents.Columns)
{
    col.SortDirection = null;
}

dgEvents.Columns[0].SortDirection = ListSortDirection.Descending;

dgEvents.Items.Refresh();
于 2016-11-03T06:38:16.073 に答える