如何调整ListBoxItems的大小以适合容器?

时间:2020-10-23 09:52:09

标签: c# wpf xaml

我正在尝试设置ListBoxItems的高度,以便它们占据网格的整个高度(例如,如果我有5个项目,则单个项目的高度总计为5)。为了获得Grid的高度,我使用了Loaded事件(我的第一个猜测是SizeChanged,但是不会触发)。我能够在MVVM中获得正确的值并计算一件物品的正确高度。 但是,我无法使对ListBoxItem的绑定起作用。当我运行我的应用程序项时,它是不可见的,但是当我尝试通过添加FallbackValue来运行程序时修改绑定时,该高度将设置为之前计算出的适当值。

您是否知道如何使这种方法起作用?如果没有,那还有什么替代方法?

View.xaml

                <Grid x:Name="ListGrid" >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Loaded">
                            <i:InvokeCommandAction Command="{Binding IconListSizeChanged}" 
                             CommandParameter="{Binding ElementName=ListGrid, Path=ActualHeight}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <ListBox VerticalAlignment="Center">
                        <ListBox.ItemContainerStyle>
                            <Style TargetType="{x:Type ListBoxItem}">
                                <Setter Property="Height" Value="{Binding DataContext.IconItemHeight}"/>
                            </Style>
                        </ListBox.ItemContainerStyle>
                        //items here
                    </ListBox>
                </Grid>

ViewModel.cs

 public ICommand IconListSizeChanged { get; private set; }
 private double iconListHeight;
 public double IconItemHeight => iconListHeight / 1234;

 public ViewModel()
 {
    IconListSizeChanged = new DelegateCommand(param => HandleListHeightChange(param));
    iconListHeight = 30.0 // initial
 }

 private void HandleListHeightChange(object param)
 {
    iconListHeight = (double)param;
 }

1 个答案:

答案 0 :(得分:0)

如果您希望每个项目都成为网格的高度,则与标记中的列表框相同。您可以绑定到实际高度。

<Grid>
    <ListBox Name="lb">
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Height" Value="{Binding ActualHeight, ElementName=lb}"/>
                <Setter Property="VerticalContentAlignment" Value="Stretch"/>
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListBox.ItemContainerStyle>
        <Rectangle Fill="Blue"/>
        <Rectangle Fill="Yellow"/>
        <Rectangle Fill="Red"/>
    </ListBox>
</Grid>

我把它作为窗口的内容放进去,当网格填满它时,它会响应窗口大小的变化