我正在尝试设置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;
}
答案 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>
我把它作为窗口的内容放进去,当网格填满它时,它会响应窗口大小的变化