Как динамически добавить RowDefinition или ColumnDefinition в Grid с привязкой? - PullRequest
10 голосов
/ 25 января 2012

Я пытаюсь создать таблицу с переменным количеством строк и столбцов. Я делаю это с ItemsControl, который имеет Grid в качестве ItemsPanel. И я знаю, что могу установить Grid.Row и Grid.Column каждого элемента через ItemContainerStyle. Но я не знаю, как изменить количество строк и столбцов и их размеры , когда я не могу получить доступ к Грид по его имени.


Вопрос:

Как можно изменить RowDefinitions или ColumnDefinitions Grid во время выполнения, используя только XAML и привязку с без кода позади * * 1023


Это код XAML:

<ItemsControl Name="myItemsControl" ItemsSource="{Binding Cells}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid Name="myGrid">

                <Grid.RowDefinitions>
                    <!-- unknown number of rows are added here in run-time -->
                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>
                    <!-- known number of columns are added here in run-time -->
                </Grid.ColumnDefinitions>

            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style.../>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

Я пытался добавить немного RowDefinition в коде позади, но я не мог найти способ получить доступ к myGrid по его имени (или как-то еще), так как он находится внутри ItemsPanelTemplate.

Мне интересно, есть ли способ программно добавить или изменить RowDefinitions во время выполнения ?

Ответы [ 2 ]

27 голосов
/ 25 января 2012

Вы можете использовать вложенные свойства для Grid, которые изменяют RowDefinitions и ColumnDefinitions, когда эти свойства установлены или изменены.

Это позволит вам написать ваш Grid так:

<Grid local:GridHelpers.RowCount="{Binding MaxGridRow}"
      local:GridHelpers.ColumnCount="3" />

Затем просто предоставьте свойство из вашего ViewModel, которое возвращает самый большой номер строки в коллекции Cells.

Подробную реализацию этих свойств можно найти в моем блоге .

9 голосов
/ 25 января 2012

Если у вас был доступ к сетке из-за кода, вы могли бы сделать это:

var rowDefinition = new RowDefinition();
rowDefinition.Height = GridLength.Auto;
grid.RowDefinitions.Add(rowDefinition);
...