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更新上列的大小。希望有道理。任何帮助表示赞赏。谢谢。
答案 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;
}
}