2010-09-08 4 views
3

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

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

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

<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> 

Заранее благодарен!

ответ

11

Это не работает, потому что свойство 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>