Подтвердить что ты не робот

Почему ItemContainerGenerator.ContainerFromIndex() возвращает значение null и как избежать такого поведения?

Я использую этот фрагмент для анализа строк, которые я выбрал на datagrid.

for (int i = 0; i < dgDetalle.Items.Count; i++)
{
    DataGridRow row = (DataGridRow)dgDetalle.ItemContainerGenerator.ContainerFromIndex(i);
    FrameworkElement cellContent = dgDetalle.Columns[0].GetCellContent(row);
    // ... code ...
}

Цикл выполняется гладко, но при обработке определенных индексов вторая строка выбрасывает нулевое исключение. Документация MSDN гласит, что ItemContainerGenerator.ContainerFromIndex(i) возвращает null, если "если элемент не реализован", но это не помогает мне угадать, как я могу получить желаемое значение.

Как я могу сканировать все строки? Есть ли другой способ?

UPDATE

Я использую этот фрагмент для чтения CheckBox, как описано здесь. Поэтому я не могу использовать привязку или ItemSource вообще, если я не изменю много вещей. И я не могу. Я занимаюсь обслуживанием кода.

4b9b3361

Ответ 1

DataGrid виртуализирует элементы, соответствующие строки (т.е. контейнеры) создаются только тогда, когда строка находится в поле зрения.

Вы можете отключить виртуализацию (что делает загрузку в первый раз очень медленной, если у вас много элементов, а использование памяти будет выше ) или вы просто перебираете данные и проверяете значения свойств объектов данных, которые должны быть привязаны к сетке данных. Обычно вам не нужны элементы пользовательского интерфейса вообще...

Ответ 2

Попробуйте это,

DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null)
        {
                          grid.UpdateLayout();
            grid.ScrollIntoView(grid.Items[index]);
            row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
        }

Ответ 3

Используйте эту подписку:

TheListBox.ItemContainerGenerator.StatusChanged += (sender, e) =>
{
  TheListBox.Dispatcher.Invoke(() =>
  {
     var TheOne = TheListBox.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
       if (TheOne != null)
         // Use The One
  });
};