2010-09-15 61 views
0

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

当列表框中没有项目时,其隐藏。 当item> 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

回答

0

只需使用一个网格,而不是一个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> 

列表框只是占据了第一排的整个空间,而UniformGrid占据了底行,只有它需要的空间(并使按钮的大小与奖励相同)。

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

+0

@Wako wako:P不错不错! – Elisabeth 2010-09-15 20:28:38

+0

http://en.wikipedia.org/wiki/Occam%27s_razor – 2010-09-15 20:30:47

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> 
相关问题