Привязать высоту строки сетки к ее содержимому в WPF - PullRequest
12 голосов
/ 08 мая 2009

У меня есть сетка с несколькими рядами. В верхней строке у меня есть ItemsControl, который динамически связан с коллекцией и использует DataTemplateSelector и ItemsPanelTemplate (с одним горизонтально расположенным WrapPanel). Вот урезанная версия того, что я имею до сих пор:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="40" />
        <RowDefinition Height="2" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <GridSplitter Background="#666" Grid.Row="1" Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
    <ItemsControl x:Name="items" Background="#DDD" Grid.Row="0" ItemTemplateSelector="{StaticResource itemTemplateSelector}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Grid>

Вместо того, чтобы устанавливать высоту первой строки равной 40, я бы хотел установить ее динамически на основе минимальной высоты, которой должен быть ItemsControl, чтобы соответствовать всему ее содержимому. Поскольку высота ItemsControl ограничена высотой строки сетки, я не могу понять, к какому элементу я должен быть привязан и к какому свойству элемента я должен его привязать.

Имеет смысл привязать высоту строки сетки к «желаемой высоте» ItemsControl. Итак, я нашел свойство DesiredSize и привязал высоту моего RowDefinition к DesiredSize.Height ItemsControl. Это работает при первой загрузке, но не обновляется при изменении размера элемента управления (помните, что я использую WrapPanel в качестве моего ItemsPanelTemplate, поэтому при изменении размера окна высота ItemsControl должна меняться).

Кто-нибудь знает, поддерживается ли такая ситуация даже инфраструктурой привязки, или мне нужно добавить код обработчика событий для этого?

Спасибо.

1 Ответ

31 голосов
/ 08 мая 2009

Вы пытались установить высоту в Авто, чтобы достичь желаемого:

<RowDefinition Height="Auto"/>

(или я думаю, что здесь слишком просто ...?)

...