0

我想将 ListBox 的高度绑定到 StackPanel 的高度,以便 ListBox 垂直拉伸自身,因此绿色区域不再可见。

当列表框中没有项目时,它是隐藏的。当 item > 1 时,ListBox 必须将自身拉伸到添加/删除按钮,因此添加/删除按钮始终位于堆栈面板的底部(不想为此使用停靠面板)

我怎样才能做到这一点?我没有绑定错误?

<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>

替代文字

4

2 回答 2

0

要实现选择性高度(如果有项目 x 否则 y)使用值转换器......另外,我认为高度将是 NaN 所以尝试 ActualHeight (不好的做法,但可能工作)......使用像 snoop 这样的工具来查看值!

他们是您使用堆栈面板的特定原因吗?我的网格会更好地工作(StackPanel 只提供所需的最小空间,而网格可以根据需要提供尽可能多的空间)?

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="*" />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
  <ListBox Grid.Row="1" />
  <StackPanel Orientation="Horizontal" Grid.Row="1">
    <!-- Buttons -->
  </StackPanel>
</Grid>
于 2010-09-15T19:51:44.710 回答
0

只需使用 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 仅占用底行所需的空间(并且使按钮的大小都相同作为奖励)。

不需要硬编码的宽度/高度值(或任何高度/宽度的绑定),也不需要值转换器。

于 2010-09-15T20:09:08.730 回答