均匀拉伸 ListView 内的 TextBoxes

Stretch TextBoxes inside ListView uniformly

我有一个 ListView,其中项目模板是另一个 ListView,它有一个 TextBox 项目模板。这样做的最终结果是我能够将我的 "rows" 集合绑定到第一个 ListView 并且我得到了我的数据的二维网格。我实际上是在尝试实现一个基本的电子表格。

我的问题是我希望 TextBox 水平拉伸,这样它们的宽度都相同,并占据所有可用空间 space。

我删除了所有无关的样式、事件处理、上下文菜单等 - 这是代码原样:

    <ListView ItemsSource="{Binding Rows}">
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ListView ItemsSource="{Binding Path=RowData}">
                    <ListView.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal"/>
                        </ItemsPanelTemplate>
                    </ListView.ItemsPanel>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=Value, Mode=TwoWay}"/>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

我已经尝试在 ListView 的 ItemContainerStyle 上设置 Horizo​​ntalContentAlignment="Stretch",在 TextBox 本身上设置 Horizo​​ntalAlignment="Stretch",但到目前为止没有成功。我确实通过将 TextBoxes 的宽度绑定到控件上的依赖属性来实现这个 "working",该控件已更新并尝试计算所有框的正确宽度,但它相当丑陋和缓慢。

有谁知道我如何单独 XAML 完成这项工作?

不要使用 StackPanel,而是在 ItemsPanelTemplate 中使用 UniformGrid,并将其 Columns 设置为每行中所需的字段数。

<ItemsPanelTemplate>
   <UniformGrid Columns="5"/>
</ItemsPanelTemplate>

这将:

Provides a way to arrange content in a grid where all the cells in the grid have the same size.