You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF嵌套ListView宽度异常:内部ListView仅适配自身列宽

哈,这个问题我之前也碰到过!嵌套在Expander里的内部ListView总是“缩成一团”,只跟着自己的列宽走,没法撑满外层ListView的单元格宽度对吧?其实就是WPF的控件不会自动继承父容器的可用宽度,咱们改几处就能解决:

这里是调整后的完整XAML代码:

<ListView>
    <ListView.View>
        <GridView>
            <GridViewColumn>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Expander>
                            <!-- 绑定宽度到父级单元格容器,抵消默认内边距 -->
                            <ListView Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}, Path=ActualWidth}"
                                      Margin="-6"
                                      HorizontalAlignment="Stretch">
                                <ListView.View>
                                    <GridView>
                                        <!-- 用*让列自动填充可用宽度 -->
                                        <GridViewColumn Header="Order number" DisplayMemberBinding="{Binding Id}" Width="*"/>
                                        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="*"/>
                                        <GridViewColumn Header="Price" DisplayMemberBinding="{Binding Price}" Width="*"/>
                                    </GridView>
                                </ListView.View>
                            </ListView>
                        </Expander>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Header="Order number" DisplayMemberBinding="{Binding OrderNumber}"/>
            <GridViewColumn Header="Customer" DisplayMemberBinding="{Binding Customer}"/>
            <GridViewColumn Header="Total Price" DisplayMemberBinding="{Binding CombinedPrice}"/>
            <GridViewColumn Header="Urgency" DisplayMemberBinding="{Binding Urgency}"/>
        </GridView>
    </ListView.View>
</ListView>

关键改动点说明:

  • 绑定内部ListView的宽度:通过RelativeSource找到外层GridViewColumn的单元格容器(ContentPresenter),绑定它的ActualWidth,这样内部ListView就会和外层单元格保持同宽,哪怕用户拖动调整外层列宽也会自动跟着变。
  • 抵消默认内边距:内部ListView默认有6px左右的内边距,设置Margin="-6"可以把这个留白去掉,让内容完全撑满单元格。
  • 内部列用*分配宽度:把内部GridView的列宽设为*,这样三列会按比例均分内部ListView的可用宽度,而不是只显示内容的最小宽度。如果需要更精细的分配,还可以用Width="2*"这类写法,让某一列宽度是其他列的两倍。

内容的提问来源于stack exchange,提问作者asd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:11:40