我有一个带有以下ItemTemplate的ItemsControl:
<DataTemplate x:Key="myItemTemplate">
<TextBlock Height="???" Text="{Binding Path=Description}" />
</DataTemplate>
我的问题是,如何在模板中设置TextBlock的高度,使其自动假设ItemsControl.Height div ItemsCount
个垂直空间?
当只有一个项目时,我希望它是容器的整个高度,当有两个时,每个应该是一半大小,依此类推。
如果可能的话,我宁愿在XAML中完全执行此操作,以保持我的ViewModel清除UI逻辑。
答案 0 :(得分:7)
您可以使用UniformGrid
作为ItemsPanelTemplate
并将Rows
属性绑定到ItemsControl
中的项目数,如下所示:
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="{Binding Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" IsItemsHost="True"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
我没有测试这段代码,所以你需要检查它,但我认为这个想法很明确。
编辑:正如下面John所指出的,这段代码更容易:
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="1" IsItemsHost="True"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
答案 1 :(得分:0)
我将尝试记住这是一项智力练习,因为我对WPF很新。我毫不怀疑我会在适当的时候得到纠正。我认为你可以通过在高度值附加%符号来指定一个常数比例,即Height =“50%”。这是具有欺骗性的,因为它会将父元素内元素高度的所有数值相加,并将每个元素的大小作为其总和的比例。例如,高度=“50%”的三个文本块每个都有一个高度(50/150)* datatemplate的高度= 1/3。