Ширина столбца DataGrid не обновляется при изменении ItemsSource - PullRequest
4 голосов
/ 18 января 2011

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 ]

7 голосов
/ 18 января 2011

не имеет никакого смысла для меня, извините.

Я понимаю код, но эта часть:

Ширина столбца уменьшается, чтобы соответствовать правильно при увеличении размера столбца, ноне правильно сжаты, чтобы соответствовать при уменьшении размера столбца.Он не будет уменьшать размер столбца в обновлении ItemsSource после его увеличения

озадачило меня

Я понял это так:

если ширина содержимого столбца увеличивается, ширина столбца увеличивается, но если ширина содержимого уменьшается, ширина столбца не увеличивается.

Это верно?

, если это так, этоПоведение нормальное: Wpf просто изменит размер ширины столбца таблицы данных, если для него задано значение Авто, т. е. содержимое не может быть отображено полностью.Поэтому, когда ширина содержимого уменьшается, размер столбца не изменяется, так как содержимое все еще можно увидеть полностью.

Единственный способ заставить wpf пересчитать ширину столбцов состоит в том, чтобы заставить их все к 0и затем вернемся к auto в коде позади, с одним или двумя добавленными updateLayout (), но это не очень хорошее программирование: - /

Edit: в основном, в вашем коде позади:

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 () или два где-то там (после обновления и настройки обратно на авто, вероятно)

3 голосов
/ 13 июля 2011

Для удобства всех, вот метод расширения, основанный на ответе Дэвида:

public static void AutoResizeColumnWidths(this System.Windows.Controls.DataGrid dataGrid)
{
    // /2761306/shirina-stolbtsa-datagrid-ne-obnovlyaetsya-pri-izmenenii-itemssource
    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();
1 голос
/ 27 июня 2013

Гораздо меньше вспышки на экране и меньше строк, не требуется вызова для обновления.

            foreach (DataGridColumn col in dg.Columns)
            {
                col.Width = DataGridLength.SizeToCells;
                col.Width = DataGridLength.Auto;
            }
0 голосов
/ 19 февраля 2011

Может быть, я могу помочь.У меня была та же проблема, и я нашел, я думаю, хорошее решение.

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