Как заставить XAML DataGridColumns заполнить весь DataGrid?

Я использую DataGrids в XAML (не Silverlight) с изменяемыми размерами столбцами, DataGrid будет расширяться, если пользователь изменит размер экрана.

В настоящее время, если ширина всех столбцов DataGrid меньше ширины DataGrid, я получаю дополнительный "столбец", который является непривлекательным и не имеет никакой цели.

Кто-нибудь знает, как сделать один столбец всегда измененным, чтобы заполнить все оставшееся пространство?

Ответ 1

Если вы используете Width="*", столбец будет заполняться, чтобы развернуть доступное пространство.

Если вы хотите, чтобы все столбцы разделили сетку, одинаково примените это ко всем столбцам. Если вы просто хотите заполнить оставшееся пространство, просто примените его к этому столбцу, остальное будет "Авто" или определенной шириной.

Вы также можете использовать Width="0.25*" (например), если вы хотите, чтобы столбец занимал 1/4 доступной ширины.

Ответ 2

Убедитесь, что у вашего DataGrid Width установлено значение {Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window,AncestorLevel=1}}.

Таким образом, ваша настройка атрибута Width="*" на элементах DataGrid.Columns/DataGridXXXXColumn должна работать.

Ответ 3

Как уже отмечалось, ColumnWidth="*" отлично работал для DataGrid в XAML.

Я использовал это в этом контексте:

<DataGrid ColumnWidth="*" ItemsSource="{Binding AllFolders, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

Ответ 4

Задайте для столбца Width свойство пропорциональную ширину, такую ​​как *

Ответ 5

Я добавил HorizontalAlignment = "Центр" (по умолчанию это "Strech" ), и он решил мою проблему, потому что он сделал datagrid только настолько широким, насколько это необходимо. (Убрано значение параметра Ширина набора данных, если оно у вас есть.)

enter image description here

Ответ 6

Еще одно вращение на ту же тему:

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
    dataGrid.Width = e.NewSize.Width - (e.NewSize.Width * .1);

    foreach (var column in dataGrid.Columns)
    {
       column.Width = dataGrid.Width / dataGrid.Columns.Count;
    }
 }

Ответ 7

Это не расширит последний столбец сетки xaml, чтобы взять оставшееся пространство, если AutoGeneratedColumns="True".

Ответ 8

установите ONE ширину столбца для любого значения, то есть width = "*"

Ответ 9

Для тех, кто ищет обходной путь С#:

Если вам почему-то нужно включить "Автогенерируемые столбцы", вы можете указать только ширину столбцов, кроме тех, которые вы хотите автоматически изменить (она будет не занимать оставшееся пространство, но он будет изменять размер содержимого ячейки).

Пример (dgShopppingCart - это мой DataGrid):

dgShoppingCart.Columns[0].Visibility = Visibility.Hidden; 
dgShoppingCart.Columns[1].Header = "Qty";
dgShoppingCart.Columns[1].Width = 100;
dgShoppingCart.Columns[2].Header = "Product Name"; /*This will be resized to cell content*/
dgShoppingCart.Columns[3].Header = "Price";
dgShoppingCart.Columns[3].Width = 100;
dgShoppingCart.Columns[4].Visibility = Visibility.Hidden; 

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

Ответ 10

Я обнаружил, что принятый ответ не дал желаемого результата при использовании шаблонного столбца с динамическим шаблоном содержимого. Решением было использовать установщик стиля в последнем столбце и установить значение NaN (поскольку * в установщике недопустимо).

Соответствующий элемент

        <DataGridTemplateColumn.CellStyle>
            <Style TargetType="{x:Type DataGridCell}">
                <Setter Property="Width" Value="NaN"/>
            </Style>
        </DataGridTemplateColumn.CellStyle>

Полный пример DataGrid, включая приведенный выше фрагмент, приведен ниже

<DataGrid ItemsSource="{Binding myData}" MinHeight="100" HeadersVisibility="Column" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Parameter" Width="100" IsReadOnly="True" Binding="{Binding Name}"/>
        <DataGridTemplateColumn Header="Value">
            <DataGridTemplateColumn.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="Width" Value="NaN"/>
                </Style>
            </DataGridTemplateColumn.CellStyle>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ContentPresenter Content="{Binding}">
                        <ContentPresenter.Resources>
                            <DataTemplate DataType="{x:Type vm:myTypeA}">
                                <TextBlock Text="{Binding Value}" />
                            </DataTemplate>
                            <DataTemplate DataType="{x:Type vm:myTypeB}">
                                <CheckBox IsChecked="{Binding Value}"/>
                            </DataTemplate>
                        </ContentPresenter.Resources>
                    </ContentPresenter>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Ответ 11

Мой 2 Cent ->

Очень поздно на вечеринку

DataGrid → Column → Width = "*" работает, только если родительский контейнер DataGrid имеет фиксированную ширину.

пример: я помещаю DataGrid в Grid → Column, ширина которого = "Auto", тогда Width = "*" в DataGrid не работает, но если вы установите значение Grid → Column Width = "450" фиксированным, то он будет работать нормально