2010-09-15 37 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> 
相關問題