На основе ответа на вопрос SO "WPF: размещение элементов коллекции в сетке а>", у меня есть следующее:
<ItemsControl Name="itemsControl1" ItemsSource="{Binding MyItems}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Grid Name="theGrid" ShowGridLines="True" /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemContainerStyle> <Style TargetType="{x:Type FrameworkElement}"> <Setter Property="Grid.Row" Value="{Binding RowIndex}" /> <Setter Property="Grid.Column" Value="{Binding ColumnIndex}" /> </Style> </ItemsControl.ItemContainerStyle> </ItemsControl>
Теперь я хочу установить количество строк и столбцов сетки в коде позади:
theGrid.RowDefinitions.Clear();
theGrid.ColumnDefinitions.Clear();
for (uint i = 0; i < theNumberOfRows; i++)
theGrid.RowDefinitions.Add(new RowDefinition());
for (uint i = 0; i < theNumberOfCols; i++)
theGrid.ColumnDefinitions.Add(new ColumnDefinition());
Для этого, конечно, нужно найти сетку. Я использовал FindChild от CrimsonX в вопросе SO WPF способы поиска элементов управления, чтобы сначала найти itemsControl1 а затем, используя его в качестве родителя, найдите theGrid.
Grid FindTheGrid()
{
ItemsControl ic = (ItemsControl)this.FindName("itemsControl1");
Grid theGrid = FindChild<Grid>(ic, "theGrid");
}
Это работает при вызове из обработчика события нажатия кнопки. Однако он терпит неудачу при вызове из конструктора MainWindow, потому что ic ChildrenCount равен 0.
int childrenCount = VisualTreeHelper.GetChildrenCount(theParent);
Итак, как я могу установить коллекции строк и столбцов theGrid до того, как окно будет показано пользователю?