Как в WPF заставить столбец Datagrid не расширяться, а переносить значение ячейки на другую строку?

В WPF существует несколько способов заставить столбец в DataGrid не расширяться и переносить значение ячейки на другую строку. Рассмотрим два из них:

1. Использование стиля со свойствами ColumnWidth и ElementStyle.

Сначала установите свойство ColumnWidth для столбца, чтобы оно не принимало значение "Auto":

<DataGrid.Columns>
    <DataGridTextColumn Header="ColumnHeader" Width="SizeToCells" />
        <DataGridTextColumn.ElementStyle>
            <Style TargetType="TextBlock">
                <Setter Property="TextWrapping" Value="Wrap" />
                <Setter Property="VerticalAlignment" Value="Center" />
            </Style>
        </DataGridTextColumn.ElementStyle>
    </DataGridTextColumn>
</DataGrid.Columns>

Действие свойства ColumnWidth значения "SizeToCells" заставляет столбец подстроиться под содержимое ячеек, а свойства TextWrapping и VerticalAlignment применяют перенос текста на другую строку и выравнивание текста по центру соответственно.

2. Использование стиля с многолучевым привязчиком и GridLengthConverter.

Сначала установите свойство ColumnWidth для столбца, чтобы оно не принимало значение "Auto":

<DataGridTextColumn Header="ColumnHeader">
    <DataGridTextColumn.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
            <Setter Property="TextBlock.VerticalAlignment" Value="Center" />
            <Setter Property="FrameworkElement.Height">
                <Setter.Value>
                    <Binding Path="ActualWidth" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}">
                        <Binding.Converter>
                            <local:GridLengthConverter />
                        </Binding.Converter>
                     </Binding>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGridTextColumn.CellStyle>
</DataGridTextColumn>

В стиле столбца DataGridTextColumn установите CellStyle и задайте свойства TextWrapping и VerticalAlignment для TextBlock для переноса текста и выравнивания по центру. Затем установите свойство Height для FrameworkElement (в данном случае DataGridCell) с использованием привязчика и GridLengthConverter. Привязывайте ActualWidth свойства столбца DataGrid к Height свойства ячейки DataGridCell, чтобы ячейка всегда имела одинаковую высоту, как и ширина столбца.

Поскольку GridLengthConverter не является встроенным конвертером, вы должны создать его собственный класс-конвертер. Вот пример такого класса:

public class GridLengthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double width = (double)value;
        return new GridLength(width, GridUnitType.Pixel);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

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