WPF DataGrid: как установить для столбцов значение TextWrap? - PullRequest
4 голосов
/ 09 сентября 2010

Я не уверен, почему мой код не выполняет TextWrapping должным образом.Он не переносит текст для столбца «Описание» (что я и хочу).Он просто обрезает его и даже не использует "...", чтобы сообщить мне, что есть больше данных.

Я пытался использовать этот код, который я нашел в Интернете, чтобы выполнить работу, но это не помогло.не работаетВ идеале я хотел бы иметь возможность устанавливать TextWrap только для определенных столбцов, а не для всех объектов DataGridCell.

О, и обратите внимание, что я использую Microsoft.NET 4, так что это DataGrid, предлагаемый черезчто не из WPF Toolkit.

<DataGrid Name="TestGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="False" ItemsSource="{Binding IntTypes}" SelectedValue="{Binding CurrentIntType}">
 <DataGrid.Resources>
  <Style TargetType="{x:Type DataGridCell}">
   <Setter Property="Template">
    <Setter.Value>
     <ControlTemplate TargetType="{x:Type DataGridCell}">
      <Border Name="DataGridCellBorder">
       <TextBlock Background="Transparent" TextWrapping="WrapWithOverflow" TextTrimming="CharacterEllipsis" Height="auto" Width="auto">
        <ContentPresenter Content="{TemplateBinding Property=ContentControl.Content}"  ContentTemplate="{TemplateBinding Property=ContentControl.Content}" />
       </TextBlock>
      </Border>
     </ControlTemplate>
    </Setter.Value>
   </Setter>
  </Style>
 </DataGrid.Resources>
 <DataGrid.Columns>
  <DataGridTextColumn Header="ID" Binding="{Binding ID}" IsReadOnly="True" />
  <DataGridTextColumn Header="Interested Parties Description" Binding="{Binding Description}" IsReadOnly="False"  />
 </DataGrid.Columns>
</DataGrid>

Заранее спасибо!

1 Ответ

11 голосов
/ 09 сентября 2010

Это не работает, потому что свойство «Text» вашего TextBlock фактически устанавливается для другого объекта, а не просто для строки.Во время выполнения ваше VisualTree выглядит примерно так:

Cell
  - TextBlock (w/ TextWrapping and TextTrimming)
    -  ContainerVisual
       -  ContentPresenter
          -  TextBlock (auto-generated by the DataGrid)

Короче говоря, ваш код по сути делает что-то вроде этого:

<TextBlock TextTrimming="CharacterEllipsis" TextWrapping="WrapWithOverflow">
  <TextBlock Text="The quick brown fox jumps over the lazy dog"/>
</TextBlock>

Чтобы исправить это, попробуйте обновить свой ControlTemplate какследует:

<ControlTemplate TargetType="{x:Type DataGridCell}">
    <Border Name="DataGridCellBorder">
        <ContentControl Content="{TemplateBinding Content}">
            <ContentControl.ContentTemplate>
                <DataTemplate>
                    <TextBlock Background="Transparent" TextWrapping="WrapWithOverflow" TextTrimming="CharacterEllipsis" 
                                Height="auto" Width="auto" Text="{Binding Text}"/>
                </DataTemplate>
            </ContentControl.ContentTemplate>
        </ContentControl>
    </Border>
</ControlTemplate>
...