Я уверен, что большинство из вас теперь удивятся, почему нам пришлось отключить виртуализацию для сетки данных 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;связал бы это.Но производительность все та же.: (
Есть идеи у кого-нибудь?