Как получить WPF Datagrid с ячейками, которые переносят текст вместо его усечения?

Что нужно сделать, чтобы получить WPF DataGrid с ячейками, которые переносят текст вместо его усечения?

Прямо сейчас, когда текст больше и не помещается в столбец, текст усекается, и пользователи не могут видеть его значение, потому что свойство IsReadOnly DataGrid имеет значение true. Я хочу, чтобы текст в ячейках был обернут, а высота ячейки (NO CELL WIDTH) увеличила количество, необходимое для отображения всего текста.


person Community    schedule 12.01.2011    source источник


Ответы (6)


Вы можете попробовать создать шаблон для ячеек с TextBlock, в котором включен перенос текста.

person H.B.    schedule 12.01.2011
comment
Большое спасибо. Уже решил проблему со стилями. Я имею в виду, устанавливая для свойства ElementStyle DataGridTextColumn что-то такое, что имеет сеттер, например ‹Setter Property = TextBlock.TextWrapping Value = Wrap /›. Мне кажется, что лучше изменить стиль элемента управления как способ настроить элемент управления вместо того, чтобы переписывать его шаблон. В любом случае, я открыт для предложений, потому что я новичок в WPF. Моя проблема заключалась в том, что я просто не могу применить стиль ala TargetType, потому что кажется, что каким-то образом в TextBlock указан стиль, который перезаписывает примененные стили ala TargetType. Еще раз спасибо. - person ; 12.01.2011
comment
Использование стиля для этого - неплохая идея, не думаю, что есть лучшее решение (по крайней мере, для этого конкретного случая). - person H.B.; 12.01.2011
comment
Проблема в том, что при использовании шаблонного столбца вы теряете базовые функции, такие как копирование текста. В настоящее время я столкнулся с этой проблемой и вместо этого буду использовать стиль. - person Sven; 23.10.2013

Спасибо за помощь @ H.B., это помогло мне (выравнивание не является обязательным):

<DataGrid.Columns>               
    <DataGridTextColumn Header="Wrapped & centered" Binding="{Binding field}">
        <DataGridTextColumn.ElementStyle>
             <Style>                            
                 <Setter Property="TextBlock.TextWrapping" Value="Wrap" />
                 <Setter Property="TextBlock.TextAlignment" Value="Center"/>
             </Style>
         </DataGridTextColumn.ElementStyle>
    </DataGridTextColumn>
</DataGrid.Columns>
person D.Rosado    schedule 13.08.2012
comment
Для других: если это решение не работает для вас, попробуйте отрегулировать ширину столбца. Он попытается увеличить ширину столбца, прежде чем начнет переносить текст. - person DLeh; 17.04.2014
comment
Как отрегулировать ширину? Я пробую здесь код, но он не отличается от конструктора WPF в Visual Studio. - person Stealth Rabbi; 05.12.2014
comment
Установите свойство Width в DataGridTextColumn следующим образом: ‹DataGridTextColumn Header = Wrapped & center Binding = {Binding field} Width = 200› - person Rossco; 29.01.2015
comment
Вы можете сделать Width="*", который заставит его заполнить все пространство, но не больше, чем позволяет ваш контейнер. - person Anthony Nichols; 20.08.2015
comment
Спасибо @Anthony Nichols, потому что без установки Width = * это не работает. Более того, установка TextBlock.TextAlignment не требуется. С Уважением. - person ; 12.04.2020

Я сделал что-то похожее на решение Д.Росадоса. Однако мой можно использовать повторно, если у вас есть больше столбцов, которые нужно обернуть.

<UserControl.Resources>
    <Style TargetType="{x:Type TextBlock}" x:Key="WrapText">
        <Setter Property="TextWrapping" Value="Wrap"/>
    </Style>
</UserControl.Resources>

<DataGrid.Columns>
    <DataGridTextColumn IsReadOnly="False" Header="Address" 
     Binding="{Binding Address}" ElementStyle="{StaticResource WrapText}" Width="150"/>
</DataGrid.Columns>
person Rahbek    schedule 09.05.2016

Еще один простой способ задать перенос текста для столбцов Editing и Text DataGrid - указать свойство Binding и свойство TextWrapping следующим образом:

<DataGridTemplateColumn x:Name="ColumnName" Header="Column Header Goes Here">
        <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                         <TextBox Text="{Binding Path=DataBoundProperty, Mode=TwoWay}" TextWrapping="Wrap"/>
                </DataTemplate>
        </DataGridTemplateColumn.CellEditingTemplate>
        <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=DataBoundProperty, Mode=OneWay}" TextWrapping="Wrap"/>
            </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
person sheraz yousaf    schedule 09.04.2019

Вы можете попробовать создать шаблон для ячеек с помощью TextBlock, в котором включен перенос текста. Если вы используете TextBlock, у вас возникнут проблемы с копированием / вставкой.

person michal    schedule 05.11.2020

Вот еще одно решение в дополнение к другим

<DataGridTemplateColumn Header="MyFieldName" Width="150" >
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding MyField}"  TextWrapping="Wrap">
        <TextBlock.ToolTip>
          <TextBlock Text="{Binding MyField}"  />
        </TextBlock.ToolTip>
      </TextBlock>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
person DmitryBoyko    schedule 10.03.2021