2014-02-14 4 views
0

Я использую datagrid с 32 строками, и когда я пытаюсь использовать этот GetCell (28,2), его сбой, а также в строке 28-32 возникает та же проблема.WPF visualtreehelper.getchildrencount возвращает 0 на datagrid

это один: visualtreehelper.getchildrencount возвращение 0, когда его выше строка 28.

Я считаю, что если я скатываться к скрытым строкам на сетке я могу получить эти строки с GetCell() и его работа отлично.

как я могу это сделать без опрокидывания?

public DataGridCell GetCell(int row, int column) 
    { 
     DataGridRow rowContainer = GetRow(row); 

     if (rowContainer != null) 
     { 
      DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer); 

      DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      if (cell == null) 
      { 
       datagrid_arinc_const.ScrollIntoView(rowContainer, datagrid_arinc_const.Columns[column]); 
       cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      } 
      return cell; 
     } 
     return null; 
    } 

    public DataGridRow GetRow(int index) 
    { 
     DataGridRow row = (DataGridRow)datagrid_arinc_const.ItemContainerGenerator.ContainerFromIndex(index); 
     if (row == null) 
     { 
      datagrid_arinc_const.UpdateLayout(); 
      datagrid_arinc_const.ScrollIntoView(datagrid_arinc_const.Items[index]); 
      row = (DataGridRow)datagrid_arinc_const.ItemContainerGenerator.ContainerFromIndex(index); 
     } 
     return row; 
    } 

    public static T GetVisualChild<T>(Visual parent) where T : Visual 
    { 
     T child = default(T); 
     int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < numVisuals; i++) 
     { 
      Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
      child = v as T; 
      if (child == null) 
      { 
       child = GetVisualChild<T>(v); 
      } 
      if (child != null) 
      { 
       break; 
      } 
     } 
     return child; 
    } 
+1

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

+0

По умолчанию виртуализация включена для Datagrid, что означает, что генерируются только видимые контейнеры. Если вы хотите получить dataGridRow или ячейку, которая не видна, вам нужно прокручивать вниз до этой строки вручную из кода позади, чтобы его контейнер был сгенерирован или вам нужно отключить виртуализацию пользовательского интерфейса на dataGrid (в случае, если вы не хотите прокручивать вниз). –

+0

@RohitVats спасибо! Я прокручиваю вручную из кода и его работу хорошо. – mmm

ответ

1

По виртуализации пользовательского интерфейса по умолчанию Вкл для Datagrid что означает только видимые контейнеры генерируются.

В случае, если вы хотите получить dataGridRow или ячейку, которая не видна, вы должны прокрутите вниз до этой строки вручную из кода, чтобы его контейнер был сгенерирован. Обратитесь к этой статье here, чтобы вручную прокрутить dataGridRow в представлении.

ИЛИ

Отключить интерфейс виртуализации Off на DataGrid (в случае, если не хотите, чтобы прокрутить вниз), установив VirtualizingStackPanel.IsVirtualising ложь на вашей сетке.

<DataGrid VirtualizingStackPanel.IsVirtualizing="False"/> 
+1

После некоторых попыток на мне код кажется, что прокрутка вниз работает не так хорошо, но отключить виртуализацию пользовательского интерфейса Off на dataGrid работать приятно. – mmm