WPF Grid as ItemsPanel для списка, динамически связанного с ItemsControl - PullRequest
13 голосов
/ 09 августа 2011

Я использую Grid в качестве ItemsPanel для списка, динамически связанного с ItemsControl. Приведенный ниже код работает - с остающейся проблемой: я не могу найти способ динамической инициализации ColumnDefinitions и RowDefinitions сетки. Как следствие, все значения располагаются друг над другом.

<ItemsControl ItemsSource="{Binding Cells}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Grid.Row" Value="{Binding RowIndex}"/>
            <Setter Property="Grid.Column" Value="{Binding ColumnIndex}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Value}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Обратите внимание, что я ищу ответ по схеме MVVM. Поэтому подклассификация и код позади - это просто обходные пути, но не решения.

Ответы [ 2 ]

22 голосов
/ 09 августа 2011

Вам понадобится какой-то способ сообщить Сетка, сколько у нее строк / столбцов.Возможно, при загрузке каждого предмета вы можете проверить значения RowIndex и ColumnIndex и добавить строки / столбцы в сетку, если необходимо.

В качестве другой альтернативы, возможно, вы сможете выставить RowCount и ColumnCountсвойства в вашей ViewModel, которые возвращают max RowIndex и ColumnIndex, а в событии Grid Loaded добавьте столько столбцов / строк, сколько вам нужно.

Я считаю вполне приемлемым использовать code-behind в MVVM IFкод относится только к пользовательскому интерфейсу.

Другая идея состоит в том, чтобы расположить элементы в вашем коде позади в 2D-сетку, прежде чем возвращать его в представление, а затем привязать эту сетку к DataGrid с помощью * 1013.* и заголовки удалены

Обновление

Мое текущее решение этой проблемы - использовать набор AttachedProperties для Grid, который позволяет связывать RowCount и ColumnCount свойства для свойства в ViewModel

Вы можете найти код моей версии прикрепленных свойств в моем блоге здесь , и их можно использовать так:

<ItemsPanelTemplate>
    <Grid local:GridHelpers.RowCount="{Binding RowCount}"
          local:GridHelpers.ColumnCount="{Binding ColumnCount}" />
</ItemsPanelTemplate>
4 голосов
/ 09 августа 2011

Ваша сетка имеет ноль строк и столбцов, поэтому все будет отображаться поверх друг друга.Сделайте что-то вроде ниже, и это будет работать.

<ItemsControl ItemsSource="{Binding Cells}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Grid.Row" Value="{Binding RowIndex}" />
            <Setter Property="Grid.Column" Value="{Binding ColumnIndex}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Value}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...