WPF DataGrid为ColumnWidth应用样式,*不起作用

时间:2014-11-18 00:49:18

标签: c# wpf datagrid styles

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

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

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

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

3 个答案:

答案 0 :(得分:1)

DataGrid.ColumnWidth不能像其他属性一样应用样式。我们必须明确指定值

答案 1 :(得分:0)

在我正在进行的项目中,我们制作了许多ResourceDictionary中的控件。我们使用与您相同的方法。那么,Style标记是ResourceDictionary吗?

答案 2 :(得分:0)

ColumnWidth设置器适用于自动生成的列,但不适用于手动定义的列。在我看来,这似乎是对WPF的疏忽。您还无法按照this answer的说明设置样式栏的宽度。

它建议使用附加属性,并提供一个示例,我以此为灵感来解决我的问题。我定义此附加属性:

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;
    }
}

然后使用一种样式将其添加到我的DataGrids中:

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