WPF GridViewRowPresenter в ItemsControl - PullRequest
       18

WPF GridViewRowPresenter в ItemsControl

5 голосов
/ 27 марта 2009

Я только начинаю изучать WPF и пытаюсь использовать GridViewRowPresenter внутри ItemsControl, чтобы по существу дублировать функциональность простой таблицы в HTML. ListView не подходит, так как он интерактивный (чего я не хочу). Я привязан к универсальному списку объектов неизвестного количества.

У меня есть список пользовательских объектов, который имеет два строковых свойства: FirstName и LastName. Работает следующий код:

<ItemsControl Name="myItemsControl">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=FirstName}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

в то время как это ничего не делает:

<ItemsControl Name="myItemsControl">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <GridViewRowPresenter>
                <GridViewRowPresenter.Columns>
                    <GridViewColumnCollection>
                        <GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}"></GridViewColumn>
                        <GridViewColumn DisplayMemberBinding="{Binding Path=LastName}"></GridViewColumn>
                    </GridViewColumnCollection>
                </GridViewRowPresenter.Columns>
            </GridViewRowPresenter>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Я не уверен, куда идти отсюда, и я был бы очень признателен за любую помощь! Спасибо!

1 Ответ

11 голосов
/ 27 марта 2009

Если вы хотите неинтерактивную сетку элементов, вы можете использовать ItemsControl с Grid, который использует общий размер области:

<ItemsControl ItemsSource="{Binding Items}" Grid.IsSharedSizeScope="True">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" SharedSizeGroup="FirstName"/>
                    <ColumnDefinition Width="*" SharedSizeGroup="LastName"/>
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding FirstName}"/>
                <TextBlock Grid.Column="1" Text="{Binding LastName}"/>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Более эффективный подход состоит в написании собственного подкласса Panel, который работает аналогично Grid (вы могли бы, вероятно, подкласс Grid), но при необходимости автоматически добавляет строки. Затем используйте это Panel как ItemsPanel для ItemsControl.

...