DataGrid WPF: как отобразить только нужные столбцы из таблицы БД

    При разработке приложений на WPF c использованием DataGrid и привязки к данным из SQLite (или другой БД) часто возникает задача: показать не все поля таблицы, а лишь выбранные столбцы. При этом разработчик хочет сохранить возможность настройки стилей, ширины и других свойств каждого столбца. Стандартный подход - задать ItemsSource="{Binding Matches}" - автоматически генерирует колонки для всех свойств коллекции. Если вручную добавить столбцы через DataGrid.Columns, то они появляются раньше автоматически сгенерированных, но последние всё равно добавляются следом. Разберём, как это исправить и получить чистый DataGrid без лишних колонок.

    Почему появляются лишние столбцы?

    Ключевая причина - свойство AutoGenerateColumns у DataGrid. По умолчанию оно установлено в True. Даже если вы явно перечислили нужные колонки в XAML, механизм автогенерации всё равно создаст колонки для всех свойств объекта из источника данных. В результате вы получаете дублирование: сначала ваши кастомные столбцы, потом все остальные поля таблицы.

    Как отключить автогенерацию и оставить только нужные столбцы

    Решение простое: установите AutoGenerateColumns="False" в разметке DataGrid. После этого DataGrid будет отображать только те колонки, которые вы явно определили внутри DataGrid.Columns. Пример:

    <DataGrid Grid.Row="1" ItemsSource="{Binding Matches}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Дата" Binding="{Binding Date}" Width="Auto"/>
            <DataGridTextColumn Header="Счёт" Binding="{Binding Score}" Width="*"/>
            <DataGridTextColumn Header="Команда" Binding="{Binding Team}" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>

    Теперь в таблице появятся только три столбца: «Дата», «Счёт» и «Команда». Все остальные поля из коллекции Matches будут проигнорированы. Привязка Binding внутри колонок работает как обычно, так как источник данных (ItemsSource) остаётся прежним.

    Дополнительные настройки: стили, форматирование и производительность

    Настройка стилей для отдельных столбцов

    После отключения автогенерации вы можете задавать каждому столбцу собственные стили, шаблоны ячеек, заголовков и даже использовать DataGridTemplateColumn для сложного контента. Например, можно выделить цветом ячейки с определёнными значениями или добавить кнопки.

    Улучшение производительности

    Если таблица содержит много полей, автогенерация создаёт колонки для всех свойств, что замедляет загрузку и потребляет память. Отключение этой функции и явное указание только нужных колонок ускоряет рендеринг и упрощает поддержку кода.

    Работа с динамическими данными

    Если структура таблицы меняется во время выполнения, вы можете управлять колонками программно через коллекцию DataGrid.Columns, добавляя или удаляя их по необходимости. При этом AutoGenerateColumns должно оставаться False.

    Часто задаваемые вопросы

    В этом разделе собраны типичные вопросы разработчиков по настройке DataGrid в WPF.

    Как скрыть столбцы в DataGrid WPF?

    Самый простой способ - установить свойство AutoGenerateColumns="False" и перечислить только нужные столбцы в DataGrid.Columns. Альтернативно можно задать Visibility="Collapsed" для конкретной колонки, но тогда она останется в разметке.

    Почему DataGrid показывает все поля таблицы SQLite?

    Потому что по умолчанию AutoGenerateColumns равно True. DataGrid автоматически создаёт колонки для каждого свойства объекта из ItemsSource. Чтобы отобразить только выбранные поля, отключите автогенерацию.

    Как добавить свой столбец в DataGrid WPF?

    Добавьте элемент в коллекцию DataGrid.Columns, например <DataGridTextColumn Header="Имя" Binding="{Binding Name}"/>. Не забудьте отключить AutoGenerateColumns, чтобы избежать дублирования.

    Можно ли отключить автогенерацию столбцов в DataGrid через код?

    Да, достаточно в коде (например, в событии загрузки окна) установить myDataGrid.AutoGenerateColumns = false;. После этого добавьте колонки программно через myDataGrid.Columns.Add(...).

    Часто задаваемые вопросы