Как обновить DataGrid.ItemsSource без фризов (C# WPF .NET 4.5)?

398
28 марта 2017, 10:20

Приветствую всех, увы попытки найти 'велосипеды' в гугле закончились безрезультатно. Проблема такова:

У меня есть

public static DataTable DataTableAccounts { get; set; }

Который я получаю с БД

Чтоб впервые отобразить его в своем DataGrid я делаю так:

DataGridAccounts.ItemsSource = DataTableAccounts.DefaultView;

Потом я начинаю проводить 'некие манипуляции' с DataTableAccounts и чтоб отобразить измененную версию, я использую костыль:

DataGridAccounts.ItemsSource = null;
DataGridAccounts.ItemsSource = DataTableAccounts.DefaultView;

Все работает отлично, НО обновляю довольно часто, примерно раза 2 в сек. а DataTableAccounts большой (1000 рядов) Поэтому у меня все во фризах.

Вопрос такой: Как асинхронно (либо с помощью других триксов) обновлять DataGrid без фризов?

P.S. Я пытался и через Binding в разметке, но тогда ничего не обновляется=)

Answer 1

Ну по поводу фризов это логично. Когда систему заставляют перерисовываться два раза в секунду, для не самого быстрого грида это напряжно. Отсюда текущий вариант реализации будет тормозить в любом случае. Варианты решения: для текущей ситуации надо проверить что включена виртуализация ячеек у грида: EnableRowVirtualization="True", данное позволяет перерисовывать только отображаемые ячейки, скорее всего это поможет. В противном случае (да и вообще если делать по человечески)) придется думать как уменьшить число обновлений страницы. А вот тут без общего кода (как проходят манипуляции) ничего не сделать. Но общую направленность могу подсказать. ItemSource привязывает грид к коллекции. Соответсвенно при изменении коллекции меняются значения грида. Проблема в том, что метод: DefaultView, каждый раз генерирует новую, автономную, коллекцию, которая не связанна с основными данными. Следовательно надо сделать общую коллекцию, привязать к ней грид, и в коде редактировать(!) эту коллекцию). Жизнь станет проще.

READ ALSO
Переключение страниц в wpf по архитектуре mvvm

Переключение страниц в wpf по архитектуре mvvm

Всем доброго времени сутокМоя проблема заключается в следующем, как реализовать в WPF переключение между страницами используя MVVM

378
Как сделать замену частей страницы с помощью razor?

Как сделать замену частей страницы с помощью razor?

Как сделать замену(и добавление) частей страницы с помощью razor?

303
C# небезопасный буфер

C# небезопасный буфер

На https://msdnmicrosoft

281