Как я могу получить уведомление, если столбец DataGrid сортируется (а не сортируется) - PullRequest
5 голосов
/ 07 декабря 2011

Мне нужно иметь Sorted событие для DataGrid в приложении WPF, но я не могу найти способ его получить.

Вот что я пробовал:

DataGrid предоставляет событие Sorting, но я не могу использовать его, так как оно запускается до того, как сортировка будет выполнена.EventArgs дает мне столбец, который сортируется, но не так, как он сортируется, и если я получаю направление сортировки, ему присваивается старое значение.Конечно, я мог догадаться, что это будет, так как я знаю, что он переходит от нуля к восходящему и, наконец, к нисходящему, но это не будет решением, так как он потерпит неудачу, если поведение элемента управления изменится.

DataGrid имеет вид по умолчанию, который обеспечивает доступ к SortDescriptionCollection.Эта коллекция содержит все свойства сортировки, но я не вижу возможности сообщить мне об изменениях.

Я должен сказать, что я ищу решение настолько чистое, насколько это возможно, так как оно будет использоваться вбольшой проект, в котором я не могу использовать решения, которые могут потерпеть неудачу при изменении среды.

Кто-нибудь знает из опыта (или документации?), как я мог бы решить эту проблему?

Редактировать: Чтобы было яснее, чего я хочу достичь: мне нужно сообщить, какой столбец DataGrid отсортирован в каком направлении, когда пользователь сортирует столбец.Не обязательно, чтобы эта информация шла после самой сортировки, она просто должна быть правильной;)

Ответы [ 3 ]

14 голосов
/ 04 января 2013

Я сам реализовал сортировку для события DataGrid, переопределив DataGrid следующим образом:

public class ValueEventArgs<T> : EventArgs
{
    public ValueEventArgs(T value)
    {
        Value = value;
    }

    public T Value { get; set; }

}

public class DataGridExt : DataGrid
{
    public event EventHandler<ValueEventArgs<DataGridColumn>> Sorted;

    protected override void OnSorting(DataGridSortingEventArgs eventArgs)
    {
        base.OnSorting(eventArgs);

        if (Sorted == null) return;
        var column = eventArgs.Column;
        Sorted(this, new ValueEventArgs<DataGridColumn>(column));
    }
}

Чтобы использовать его, все что вам нужно сделать, это:

    private void Initialize()
    {
            myGrid.Sorted += OnSorted;
    }
    private void OnSorted(object sender, ValueEventArgs<DataGridColumn> valueEventArgs)
    {
    // Persist Sort...
    }
1 голос
/ 29 мая 2015

Я не мог заставить решение Стивена Лотье работать в VB.Net, но я нашел другое решение, которое может работать.

Всякий раз, когда происходит операция сортировки, в указанном порядке происходят следующие события:

  1. Сортировка
  2. UnloadingRow (для всех строк в DataGrid)
  3. LoadingRow (для всех строк в DataGrid)
  4. LayoutUpdated

Это можно использовать следующим образом:

Переменные

Private _updateSorted As Boolean
Private _tempSender As Object
Private _rowsLoaded As List(Of DataGridRowEventArgs)
_rowsLoaded = New List(Of DataGridRowEventArgs)

Сортировка

Private Sub myDataGrid_Sorting(sender As Object, e As DataGridSortingEventArgs) Handles myDataGrid.Sorting
    _updateSorted = True
    _rowsLoaded.Clear()
    _tempSender = Nothing
End Sub

События выгрузки / загрузки строки

'Save pre-sorting state here, if desired'
'Perform operation on pre-sorting rows here, if desired'
Private Sub myDataGrid_UnloadingRow(sender As Object, e As DataGridRowEventArgs) Handles myDataGrid.UnloadingRow

End Sub

'Save post-sorting state here.'
'Perform operation on post-sorting rows here'
'In this example, the operation is dependent on the DataGrid updating its layout first so I included items relevant to handling that'
Private Sub myDataGrid_LoadingRow(sender As Object, e As DataGridRowEventArgs) Handles myDataGrid.LoadingRow
    Dim myDataGridCell As DataGridCell = GetCellByRowColumnIndex(myDataGrid, e.Row.GetIndex, colIndex)  
    'Or whatever layout-dependent object you are using, perhaps utilizing e As DataGridRowEventArgs'

        If Not IsNothing(myDataGridCell) Then
           '~~ Perform operations here ~~'
        Else
            If _updateSorted Then
                'Update has occurred but the updated DataGrid is not yet available'
                'Save variables to use once the DataGrid is updated'
                _rowsLoaded.Add(e)
                _tempSender = sender
            End If
        End If
End Sub

LayoutUpdated

Private Sub myDataGrid_LayoutUpdated(sender As Object, e As EventArgs) Handles myDataGrid.LayoutUpdated
    If _updateSorted Then
        Dim rowsLoaded As New List(Of DataGridRowEventArgs)
        For Each eRow As DataGridRowEventArgs In _rowsLoaded
            rowsLoaded.Add(eRow)
        Next

        For Each eRow As DataGridRowEventArgs In rowsLoaded
            'Now perform the action to the sorted DataGridRows in the order they were added'
            myDataGrid_LoadingRow(_tempSender, eRow)
        Next
        _updateSorted = False
    End If
End Sub
0 голосов
/ 13 декабря 2011

После многих часов попыток и чтения я смог решить проблему сам. Я не совсем доволен решением, но оно работает для меня.

Поскольку я позволяю генерировать столбцы DataGrid по коду, я мог бы использовать DependencyProperty SortDirection каждого столбца и добавить метод, который будет вызываться при изменении свойства. Это делается так:

DataGridBoundColumn column = GetTheColumnIWantToObserve();
if (column != null)
{
    // add value changed notification to be informed about changes
    var desc = DependencyPropertyDescriptor.FromProperty(DataGridColumn.SortDirectionProperty, typeof(DataGridColumn));
    desc.AddValueChanged(column, ColumnSortDirectionChanged);
}

В методе ColumnSortDirectionChanged Теперь я могу работать с изменениями.

private void ColumnSortDirectionChanged(object sender, EventArgs eventArgs)
{
    var column = sender as DataGridColumn;
    if (column != null)
    {
        var newSortDirection = column.SortDirection;
        // Yay, I got it!!
    }
}

Если бы я не создавал столбцы самостоятельно, мне пришлось бы использовать событие DataGrid (например, Loaded или AutoGeneratedColumns) и добавить уведомление во все существующие столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...