Как улучшить производительность сортировки в нед виртуализированной DataGrid? - PullRequest
10 голосов
/ 25 мая 2011

Я уверен, что большинство из вас теперь удивятся, почему нам пришлось отключить виртуализацию для сетки данных wpf.Хотя виртуализация помогает уменьшить объем используемой памяти, она увеличивает нагрузку на процессор и обеспечивает беспроблемную прокрутку.

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

Однако сортировка теперь стала большой проблемой.Хотя это правда, что использование CustomSorter: IComparer было бы лучшей альтернативой сортировки обычным SortDecriptors, в нашем случае это практически не имеет значения, поскольку перерисовываются целые строки.

Есть ли способ улучшить сортировкускорость на не виртуализированной сетке данных?

Высоко оценен,

ОБНОВЛЕНИЕ:

Я натолкнулся на идею, которую я пытаюсь реализовать,Открепив привязку от источника Item, выполните сортировку, и после завершения сортировки снова свяжите источник Item.

Чтобы добиться этого, я извлекаю данные из DataGrid для захвата SortHandler (то есть, когда пользователь щелкает столбец)

public class CustomSortDataGrid : DataGrid
    {
        public CustomSortDataGrid()
        {
            Sorting += SortHandler;
        }

        private void SortHandler(object sender, DataGridSortingEventArgs e)
        {
            DataGridColumn column = e.Column;
            IComparer comparer = null;

            // prevent the built-in sort from sorting
            e.Handled = true;

            ListSortDirection direction = (column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending;

            //set the sort order on the column
            column.SortDirection = direction;

            //use a ListCollectionView to do the sort.
            var lcv = (ListCollectionView)CollectionViewSource.GetDefaultView(ItemsSource);


            comparer = new BidYieldComparer(direction);

            //apply the sort
            lcv.CustomSort = comparer;

        }
    }

При этом будет использоваться более быстрая сортировка сравнения, которая превосходит SortDescriptors.Теперь вопрос в том, на каком этапе я могу развязать сортировку элементов, применить сортировку, дождаться сортировки, когда произойдет событие (какое?), А затем снова связать источник элементов с представлением.

BindingOperations.ClearBinding(this, ItemsSourceProperty);

Эта строкавыше очистит привязку.

//apply the sort
            lcv.CustomSort = comparer;

И теоретически (не уверен, что это правильный путь) ItemsSource = lcv;связал бы это.Но производительность все та же.: (

Есть идеи у кого-нибудь?

Ответы [ 2 ]

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

Я полагаю, что проблема производительности заключается не в самой сортировке, а в самой привязке и повторной привязке.

Просто очистите привязку и повторно привязайте свою сетку.Вы не должны видеть большой разницы по сравнению с сортировкой.

Если это так, вы можете попытаться упростить ваши шаблоны и стили для этой сетки, если вы используете какую-либо.

1 голос
/ 28 мая 2011

Попробуйте сначала отсортировать свою коллекцию, а затем привязать отсортированную коллекцию к своей DataGrid. Скорость операции сортировки зависит от алгоритма сортировки, который вы будете использовать. Раньше я использовал Алгоритм сортировки вставок , о котором вы можете прочитать в http://en.wikipedia.org/wiki/Insertion_sort Я скоро пришлю вам пример.

Обновление

вы можете найти VB.Net реализацию здесь

вы можете найти C# реализацию здесь

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