Данные курорта в WPF DataGrid - PullRequest
1 голос
/ 27 июня 2011

У меня есть простая коллекция, которая обновляется в режиме реального времени. Данные отображаются в DataGrid в WPF. Когда пользователь сортирует DataGrid и данные изменяются, сетка обновляется новыми данными, но не обрабатывает данные.

Кто-нибудь найдет хороший способ прибегнуть к данным при изменении базовой коллекции? Я легко могу определить, когда произошла смена коллекции, но пока мне не удалось добиться успеха в этом.

Найдено, я могу сделать это:

SortDescription description = grdData.Items.SortDescriptions[0];
grdData.ItemsSource = null;
grdData.ItemsSource = Data;
grdData.Items.SortDescriptions.Add(description);

if(description.PropertyName=="Value")
{
    grdData.Columns[1].SortDirection = description.Direction;
}
else
{
    grdData.Columns[0].SortDirection = description.Direction;
}

Но это довольно круто. Что-нибудь лучше придумать?

1 Ответ

1 голос
/ 27 июня 2011

Это немного сложно и во многом зависит от базового источника данных, но вот что я делаю:

Прежде всего, вам нужен тип данных, который можно сортировать.Для этого я создал «SortableObservableCollection», поскольку моим базовым типом данных является ObservableCollection:

public class SortableObservableCollection<T> : ObservableCollection<T>
{        
    public event EventHandler Sorted;       

    public void ApplySort(IEnumerable<T> sortedItems)
    {
        var sortedItemsList = sortedItems.ToList();

        foreach (var item in sortedItemsList)
            Move(IndexOf(item), sortedItemsList.IndexOf(item));       

        if (Sorted != null)
            Sorted(this, EventArgs.Empty);
    }
}

Теперь, когда в качестве источника данных я могу обнаруживать сортировки в моей DataGrid и обрабатывать фактические данные,Чтобы сделать это, я добавил следующий обработчик события в событие CollectionChanged элементов моей DataGrid:

... In the constructor or initialization somewhere

ItemCollection view = myDataGrid.Items as ItemCollection;
((INotifyCollectionChanged)view.SortDescriptions).CollectionChanged += MyDataGrid_ItemsCollectionChanged;

...

private void MyDataGrid_ItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    // This is how we detect if a sorting event has happend on the grid.
    if (e.NewItems != null &&
        e.NewItems.Count == 1 &&
        (e.NewItems[0] is SortDescription))
    {
        MyItem[] myItems = new MyItem[MyDataGrid.Items.Count]; // MyItem would by type T of whatever is in the SortableObservableCollection
        myDataGrid.Items.CopyTo(myItems, 0);
        myDataSource.ApplySort(myItems);  // MyDataSource would be the instance of SortableObservableCollection
    }
} 

Одна из причин, по которой это работает немного лучше, чем использование SortDirection, заключается в выполнении комбинированной сортировки(удерживайте нажатой клавишу shift при сортировке столбцов, и вы поймете, что я имею в виду).

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