Silverlight DatagridColumn.DisplayIndex change throw ArgumentOutOfRangeException

Так же ищут: DisplayIndex, error, DataGrid


microsoft-silverlight-logo В процессе разработки столкнулся с непонятной ошибкой. Выставляем свойство DisplayIndex у столбца DataGrid’а, в момент когда DataGrid не виден. Делаем DataGrid видимым и получаем исключение ArgumentOutOfRangeException. Долго ковыряя поиск все таки нашел в решение.

Фокус в том, что баг возникает только тогда когда мы пытаемся поменять DisplayIndex у не загруженного визуального контрола. Таким образом нам нужно перед обсновлением свойства проверить загружен ли контрол. Не долго думая добавил свойство isLoaded булевого типа, которое выставляю в true при Loaded событии и в false при Unloaded. Проверяю свойство перед обновлением DisplayIndex и если оно false, то выставляю флаг, что нужно обновить DisplayIndex позже, когда объект будет отрисован.

Вот пример реализации:

private void ColumnsReorder() {
   // манипуляции с DisplayIndex
}

bool isLoaded = false;
bool isNeedReorder = false;

void repgenPreviewGrid_Unloaded(object sender, RoutedEventArgs e)
{
   isLoaded = false;
}
void repgenPreviewGrid_Loaded(object sender, RoutedEventArgs e)
{
   isLoaded = true;
   if (isNeedReorder) {
      ColumnsReorder()
      needReorder = false;
   }
}

// Вызов изменения DisplayIndex
if (isLoaded)
   ColumnsReorder();
else
   needReorder = true;

Как видите, идея проста и не требует особых усложнений кода.

Метки: ,

Добавить комментарий

Вы должны авторизоваться для отправки комментария.