在ItemsSource上未更新的DataGrid-Column宽度更改

时间:2011-01-18 15:13:34

标签: wpf datagrid resize

XAML:

<DataGrid.Columns>
    <DataGridTextColumn x:Name="colDisplayName" Width="Auto" IsReadOnly="True" Header="Name" Binding="{Binding ssn.SSN_DISPLAY_NAME}"></DataGridTextColumn>
    <DataGridTextColumn x:Name="colValue" Width="Auto" Header="Value" Binding="{Binding ssv.SSV_VALUE}" CellStyle="{StaticResource SingleClickEditing}"></DataGridTextColumn>
    <DataGridTextColumn x:Name="colDescription" Width="Auto" IsReadOnly="True" Header="Description" Binding="{Binding ssn.SSN_DESCRIPTION}"></DataGridTextColumn>
    <DataGridTextColumn x:Name="colUnit" Width="Auto" IsReadOnly="True" Header="Unit Abbreviation" Binding="{Binding ssn.UNIT_TYPE.UNIT_NAME.UN_ABBREVIATION}"></DataGridTextColumn>
    </DataGrid.Columns>

CS:

private void tvSystemConfiguration_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
       {
           dgSystemSettings.ItemsSource =
               ((tvSystemConfiguration.SelectedItem as SYSTEM_SETTINGS_GROUP).SYSTEM_SETTINGS_NAMEs.Join
               (ssdc.SYSTEM_SETTINGS_VALUEs, x => x.SSN_ID, y => y.SSV_SSN_ID, (x, y) => new DataGridItem{ ssn = x, ssv = y })).ToList();
       }

当列大小增加时,列宽会缩小以正确拟合,但在列大小减小时,不能正确缩小以适应。在增加后,它不会减少ItemsSource更新上列的大小。希望有道理。任何帮助表示赞赏。谢谢。

4 个答案:

答案 0 :(得分:7)

对我没有任何意义,抱歉。

我理解代码,但这一部分:

  

当列大小增加时,列宽会缩小以正确拟合,但确实如此   当柱尺寸减小时,不适当缩小以适应。它不会   在ItemsSource更新增加后删除列的大小

让我困惑的是

我理解这一点:

  

如果列的内容宽度增加,则列的宽度会增加,但如果   内容的宽度减小,列的宽度不会。

是吗?

如果是这样,这种行为是正常的:如果需要,Wpf只会调整数据网格的列宽设置为自动,即:内容无法完全显示。因此,当内容的宽度缩小时,该列不会调整大小,因为仍然可以完全看到内容。

我唯一可以看到迫使wpf重新计算列的方法&#39;宽度将强制它们全部为0,然后在后面的代码中返回自动,抛出一个或两个updateLayout(),但这不是很好的编程: - /

修改 基本上,在你的代码背后:

foreach (DataGridColumn c in dg.Columns)
    c.Width = 0;

// Update your DG's source here

foreach (DataGridColumn c in dg.Columns)
    c.Width = DataGridLength.Auto;

你可能需要一个dg.UpdateLayout()或其中的两个(在更新之后,设置回自动)

答案 1 :(得分:3)

为了方便大家,这里有一个基于David回答的扩展方法:

public static void AutoResizeColumnWidths(this System.Windows.Controls.DataGrid dataGrid)
{
    // http://stackoverflow.com/questions/4725724/wpf-datagrid-column-widths-not-updating-on-itemssource-change
    foreach (var column in dataGrid.Columns)
        column.Width = 0;

    dataGrid.UpdateLayout();

    foreach (var column in dataGrid.Columns)
        column.Width = System.Windows.Controls.DataGridLength.Auto;

    dataGrid.UpdateLayout();
}

它将如何被称为:

dataGrid.AutoResizeColumnWidths();

答案 2 :(得分:1)

屏幕上的闪存少得多,线路也少,无需调用updateLayout:

            foreach (DataGridColumn col in dg.Columns)
            {
                col.Width = DataGridLength.SizeToCells;
                col.Width = DataGridLength.Auto;
            }

答案 3 :(得分:0)

也许我可以帮忙。我遇到了同样的问题,我发现,我认为这是一个很好的解决方案。

private void DataGrid_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        DataGrid dg = (DataGrid)sender;
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            double width = 0;
            foreach (DataGridColumn column in dg.Columns)
            {
                width += column.ActualWidth;
            }
            dg.Width = width + 2;
        }
    }