#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;
У этого есть недостаток в одновременной реализации строк, поэтому, к сожалению, вы не можете выполнять пакеты и сохранять память. Это также не позволяет вам выбирать конкретные строки для реализации.