我正在ItemsControl(ListBox)
尝试购物车的内容。为此,我创建了以下DataTemplate
:
<DataTemplate x:Key="Templates.ShoppingCartProduct"
DataType="{x:Type viewModel:ProductViewModel}">
<DockPanel HorizontalAlignment="Stretch">
<TextBlock DockPanel.Dock="Left"
Text="{Binding Path=Name}"
FontSize="10"
Foreground="Black" />
<TextBlock DockPanel.Dock="Right"
Text="{Binding Path=Price, StringFormat=\{0:C\}}"
FontSize="10"
Foreground="Black" />
</DockPanel>
</DataTemplate>
当商品显示在我的购物车中时,名称和价格TextBlocks
正好位于彼此旁边,并且右侧有大量的空白。
想知道强迫DockPanel
伸展以填充ListItem
提供的所有空间的最佳方法是什么?
答案 0 :(得分:27)
将Width
的{{1}}绑定到DockPanel
的{{1}}:
ActualWidth
另一种选择:您可以重新定义ListBoxItem
,以便<DockPanel Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">
...
水平拉伸:
ItemContainerStyle
答案 1 :(得分:6)
停靠面板的好处是它们已经填满了所有可用空间。 LastChildFill默认为true(但我为了清楚起见将其设置在下面),所以不要在最后一个子节点上设置DockPanel属性,它将填充可用空间。
<DockPanel HorizontalAlignment="Stretch" LastChildFill="true">
<TextBlock DockPanel.Dock="Left"
Text="{Binding Path=Name}"
FontSize="10"
Foreground="Black" />
<TextBlock
Text="{Binding Path=Price, StringFormat=\{0:C\}}"
FontSize="10"
Foreground="Black" />
</DockPanel>
答案 2 :(得分:4)
DockPanel
是邪恶的。将StackPanel/DockPanel
组合用于复杂布局的诱惑导致“布局死胡同”。使用网格:
<Grid>
<TextBlock HorizontalAlignment="Left"
...
<TextBlock HorizontalAlignment="Right"
...
/Grid>
我几乎完全使用Grid
,为每个“属于一起”的元素块使用单独的网格