Как реализовать строки в сетке данных WPF

#wpf

Вопрос:

Как я могу принудительно реализовать виртуализированные (и закадровые) строки в DataGrid?

В идеале я хочу сохранить строки виртуализированными по умолчанию и реализовывать их только тогда, когда мне это нужно. К сожалению, это:

 (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(j);
 

возвращает null для виртуализированных строк, и я не вижу способа это изменить.

Установка значения виртуализации строк false не требует реализации существующих элементов, поэтому его отключение не делает то, что мне нужно.

Комментарии:

1. Контейнеры пользовательского интерфейса создаются после их прокрутки в поле зрения. Вы можете/должны сделать это по-мужски. У вас не возникло бы этой проблемы, если бы вы правильно использовали элементы управления. Вы должны создать модели данных внутри коллекции ObservableCollection, а затем назначить их DataGrid.ItemsSource (или ItemsControl.ItemsSource в целом), предпочтительно с помощью привязки данных. Таким образом, вам не нужно заботиться о контейнерах элементов или средствах просмотра прокрутки. Вы просто получаете доступ к коллекции данных и выбираете нужные вам предметы. Когда вы имеете дело с элементами пользовательского интерфейса в WPF для обработки ваших данных, вы делаете это неправильно.

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

3. @BionicCode Ты слишком много думаешь о моей ситуации. Мой вариант использования здесь — «Создать снимок того, что пользователь видит в общем виде». Код здесь ничего не знает о лежащей в основе модели данных, и ему необходимо точно зафиксировать то, что отображается в данной сетке данных. Я знаю, как это сделать с помощью моделей, если они известны, но в данном случае я знаю, что делаю, и вопрос именно в том, «Как мне реализовать строку, чтобы можно было захватить форматированное содержимое».

4. Тот факт, что мне приходится слишком много предполагать о вашей ситуации, доказывает низкое качество вашего вопроса. В вашем вопросе никогда не говорилось о том, «что видит пользователь» . Только о виртуализации пользовательского интерфейса. Если речь идет о том, что видит пользователь, то виртуализация пользовательского интерфейса не является темой, поскольку пользователь может видеть только реализованные элементы, а все видимое (внутри окна просмотра) уже реализовано.

5. Не можете ли вы просто установить значение EnableRowVirtualization false и обновить ?

Ответ №1:

Как ответил Энди в комментариях, обновление представления приведет к осознанию.

Хотя это, похоже, не задокументировано явно, dataGrid.UpdateLayout() после отключения виртуализации строк сработало для всех строк в сетке.

Поскольку я все равно хотел получить доступ ко всем строкам, я в конечном итоге использовал:

 dataGrid.EnableRowVirtualization = false;
dataGrid.UpdateLayout();
// get the content as displayed
dataGrid.EnableRowVirtualization = true;
 

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