WPF 数据网格应用带有 * 的列宽样式不起作用

本文关键字:样式 不起作用 数据网 数据 网格 应用 WPF | 更新日期: 2023-09-27 18:30:39

我尝试全局应用DataGrid的样式,如下所示:

<Style TargetType="DataGrid">
    <Setter Property="ColumnWidth" Value="*"/>
    <Setter Property="RowHeaderWidth" Value="0"/>
</Style>

RowHeaderWidth 的样式有效,但ColumnWidth样式不起作用(DataGrid 末尾有空列)。当我在 DataGrid 中显式设置ColumnWidth="*"时,它可以工作(空列已消失)。

我想知道我们是否能够在样式中全局设置ColumnWidth="*"?提前谢谢你!

WPF 数据网格应用带有 * 的列宽样式不起作用

DataGrid.ColumnWidth 不能将样式作为其他属性应用。我们必须显式分配值

在我正在从事的项目中,我们制作了很多自己的控件,这些控件位于ResourceDictionary中。我们使用与您完全相同的方法。那么,您的Style标签在ResourceDictionary中吗?

ColumnWidth setter 适用于自动生成的列,但不适用于手动定义的列。对我来说,这似乎是 WPF 中的一个疏忽。您也无法设置列本身的宽度样式,如本答案所述。

它建议使用附加属性,并提供一个示例,我使用该示例作为解决方案的灵感。我定义这个附加属性:

public static class DataGridHelper
{
    public static DataGridLength GetColumnWidth(DataGrid obj) => (DataGridLength)obj.GetValue(ColumnWidthProperty);
    public static void SetColumnWidth(DataGrid obj, DataGridLength value) => obj.SetValue(ColumnWidthProperty, value);
    /// <summary> 
    ///   The ColumnWidth attached property sets the Width of all columns.
    /// </summary>
    public static readonly DependencyProperty ColumnWidthProperty =
        DependencyProperty.RegisterAttached("ColumnWidth", typeof(DataGridLength), typeof(DataGridHelper), new PropertyMetadata(ColumnWidthChanged));
    private static void ColumnWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var dataGrid = d as DataGrid;
        var columns = dataGrid.Columns;
        var width = GetColumnWidth(dataGrid);
        dataGrid.Columns.CollectionChanged += (s1, e1) => UpdateColumnWidths(columns, width);
        UpdateColumnWidths(columns, width);
    }
    private static void UpdateColumnWidths(ICollection<DataGridColumn> columns, DataGridLength width)
    {
        foreach (var column in columns) column.Width = width;
    }
}

然后使用样式将其添加到我的数据网格中:

<Style TargetType="DataGrid">
    <Setter Property="local:DataGridHelper.ColumnWidth" Value="*"/>
</Style>