DataGrid.ColumnWidth="*" 在 ScrollViewer 中不工作

DataGrid.ColumnWidth="*" not working in a ScrollViewer

我有一个 DataGridColumnWidth="*" 在一个 ScrollViewerHorizontalScrollBarVisibility="Auto" 中。不幸的是,这种组合似乎效果不佳。虽然 DataGrid 正确地跨越整个 window 宽度,但列非常小 (MinWidth)。如果我将 HorizontalScrollBarVisibility 更改为 Disabled 它可以工作,但我失去了所需的 ScrollViewer 行为。

最小工作示例:

<Window x:Class="WPF_Sandbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Sandbox"
        Title="MainWindow"
        x:Name="ThisControl">
    <ScrollViewer HorizontalScrollBarVisibility="Auto">
        <DataGrid AutoGenerateColumns="False" ColumnWidth="*">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Column 1" />
                <DataGridTextColumn Header="Column 2" />
                <DataGridTextColumn Header="Column 3" />
                <DataGridTextColumn Header="Column 4" />
            </DataGrid.Columns>
        </DataGrid>
    </ScrollViewer>
</Window>

为什么会发生这种情况,我该如何解决?

您看到的问题是因为 Datagrid 在 ScrollViewer 中,它几乎可以无限扩展 space,所以它无法计算宽度。为此,您可以将 DataGrid Width 绑定到 ScrollViewer ViewportWidth,如下所示:

<DataGrid AutoGenerateColumns="False" ColumnWidth="*" 
Width="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type ScrollViewer}}, Path=ViewportWidth}">