Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf DataGrid列宽未在ItemsSource更改时更新_Wpf_Datagrid_Resize - Fatal编程技术网

Wpf DataGrid列宽未在ItemsSource更改时更新

Wpf DataGrid列宽未在ItemsSource更改时更新,wpf,datagrid,resize,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=

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>

政务司司长:

private void tvSystemConfiguration\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
dgSystemSettings.ItemsSource=
((tvSystemConfiguration.SelectedItem作为系统设置组)。系统设置名称。加入
(ssdc.SYSTEM_SETTINGS_value,x=>x.SSN_ID,y=>y.SSV_SSN_ID,(x,y)=>newdatagriditem{SSN=x,SSV=y})).ToList();
}

当列大小增加时,列宽会正确收缩以适应,但当列大小减小时,列宽不会正确收缩以适应。在ItemsSource更新上的列的大小增加后,它不会减小该列的大小。希望这是有道理的。感谢您的帮助。谢谢。

对我来说没有任何意义,对不起

我理解代码,但这部分:

增加列大小时,列宽会收缩以正确匹配,但不会 列大小减小时未适当收缩以适应。不会的 在ItemsSource更新中,列的大小增加后,减小列的大小

我感到困惑

我是这样理解的:

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

是这样吗

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

我能看到的强制wpf重新计算列宽度的唯一方法是将它们全部强制为0,然后在后面的代码中返回到auto,并抛出一两个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()或两个(在更新和设置回自动之后)

也许我可以帮您。我也有同样的问题,我觉得我找到了一个很好的解决办法

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

为了方便大家,这里有一个基于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();

屏幕上的闪烁更少,行数更少,无需调用updateLayout:

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

是的,这正是我的问题,所有内容都会完美地增加,但当列的内容收缩时,它无法正确调整列宽。我还尝试设置datagrid.itemssource=null,然后在selecteditemchanged事件中再次设置它,以尝试强制列只增加,但它似乎不起作用。是的,因此我想到的唯一解决方案是描述:清空dataGrid的源,强制所有列的宽度为0,updateLayout(),然后强制宽度返回自动,然后更新源。但是它会在屏幕上“闪现”任何关于在代码隐藏中强制宽度自动的建议吗?myColumn.Width=DataGridLength.auto--请看:使用silverlight,我只需要第一次更新。此外,我还必须使用column.Width=newDataGridLength(0).Perfect。非常感谢。
            foreach (DataGridColumn col in dg.Columns)
            {
                col.Width = DataGridLength.SizeToCells;
                col.Width = DataGridLength.Auto;
            }