将StackPanel内列表框的高度绑定到StackPanel的高度

时间:2010-09-15 19:28:40

标签: wpf binding elementname

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

当列表框中没有项目隐藏时。 当有项目时> 1 ListBox必须将其自身拉伸到add / del按钮,因此add / del按钮总是位于stackpanel的底部(不想使用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 :(得分: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>

答案 1 :(得分: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只占用底行,只占用所需空间(并使按钮的大小与奖励相同)。

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