Привязать высоту списка внутри StackPanel к высоте StackPanel - PullRequest
0 голосов
/ 15 сентября 2010

Я хочу привязать высоту ListBox к высоте StackPanel, чтобы ListBox растягивался вертикально, так что зеленая область больше не видна.

Когда в списке нет элемента, он скрыт. Когда есть элемент> 1, ListBox должен растягиваться до кнопок add / del, чтобы кнопки add / del всегда находились внизу стековой панели (для этого не нужно использовать dockpanel)

Как я могу это сделать? Я не получаю обязательных ошибок?

<StackPanel x:Name="stack" Background="Green" DataContext="{Binding DocumentViewModelList/}" Orientation="Vertical" >
    <ListBox SelectionMode="Single" VirtualizingStackPanel.IsVirtualizing="False"
        SelectedItem="{Binding SelectedDocumentViewModel,Mode=TwoWay}"
        Height="{Binding ElementName=stack,Path=Height}"                                               
        Width="Auto"
        Focusable="True"
        ScrollViewer.HorizontalScrollBarVisibility="Auto" 
        ScrollViewer.VerticalScrollBarVisibility="Auto" 
        Grid.Row="1" 
        Name="documentListBox"
        BorderThickness="1"                                                
        ItemsSource="{Binding DocumentList}"
        Visibility="{Binding ElementName=documentListBox,Path=HasItems, Converter={StaticResource boolToVisibilityConverter}}">

        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Path=Id}" />
                    <TextBlock Text="{Binding Path=Name}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>

        <!--<ListBox.ItemContainerStyle>                                                  
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}" />                                                      
        </Style>      
        </ListBox.ItemContainerStyle>-->                                        
    </ListBox>                                                                                      
</StackPanel>

alt text

Ответы [ 2 ]

0 голосов
/ 16 сентября 2010

Просто используйте Grid вместо StackPanel:

<Grid x:Name="grid" 
      Background="Green" 
      DataContext="{Binding DocumentViewModelList}">

    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <ListBox Grid.Row="0"
             HorizontalAlignment="Stretch"
             VerticalAlignment="Stretch"  ..... />

    <UniformGrid Grid.Row="1"
                 Rows="1"
                 HorizontalAlignment="Center"
                 VerticalAlignment="Bottom">
        <Button Content="Delete" />
        <Button Content="Add" />
        <Button Content="Open" />
    </UniformGrid>

</Grid>

ListBox просто занимает все пространство первой строки, в то время как UniformGrid занимает нижнюю строку только с требуемым пространством (и делает кнопки одинакового размера с бонусом).

Нет необходимости в жестко запрограммированных значениях ширины / высоты (или каких-либо привязок для высоты / ширины) и преобразователей значений не требуется.

0 голосов
/ 15 сентября 2010

Чтобы реализовать выборочную высоту (если есть элементы x или y), используйте преобразователь значений ... также я думаю, что высота будет NaN, поэтому попробуйте ActualHeight (плохая практика, но может работать) ... используйте инструмент, подобный snoop посмотрите значения!

Является ли их конкретной причиной, по которой вы используете стекпанель? I Сетка будет работать лучше (StackPanel дает только минимальное пространство, необходимое, когда сетка может дать столько места, сколько необходимо)?

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="*" />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
  <ListBox Grid.Row="1" />
  <StackPanel Orientation="Horizontal" Grid.Row="1">
    <!-- Buttons -->
  </StackPanel>
</Grid>
...