wpf DataGrid 更改单元格上的包装

wpf DataGrid change wrapping on cells

我有一个带有自动生成列的 WPF DataGrid。我已经能够使用代码覆盖 headers 列,并且在缩小列时也可以在 headers 列上强制换行。当我试图在单元格上强制文本换行时,我的绑定中断了……它在每一列中显示相同的值。

这是我用来格式化

的 XAML
<DataGrid.CellStyle>
   <Style TargetType="DataGridCell">
       <Setter Property="ContentTemplate">
           <Setter.Value>
               <DataTemplate>
                   <TextBlock TextWrapping="Wrap" Text="{Binding}"></TextBlock>
               </DataTemplate>
           </Setter.Value>
       </Setter>
   </Style>
</DataGrid.CellStyle>
<DataGrid.ColumnHeaderStyle>
   <Style TargetType="DataGridColumnHeader">
       <Setter Property="ContentTemplate">
           <Setter.Value>
               <DataTemplate>
                   <TextBlock TextWrapping="Wrap" Text="{Binding}"></TextBlock>
               </DataTemplate>
           </Setter.Value>
       </Setter>
   </Style>
</DataGrid.ColumnHeaderStyle>

同样,ColumnHeaderStyle 工作正常,但 CellStyle 不工作。

建议?

更新:

第headers列设置如下:

if (e.Column.Header.ToString() == "Product_Description")
    e.Column.Header = "Product";

if (e.Column.Header.ToString() == "Original_Gross_Weight")
    e.Column.Header = "Orig. Net Wt.";

headers 的环绕效果很好。仅仅包装内容是行不通的。

在绑定上,似乎一旦替换了 DataGridCell 数据样式, 的完整对象就会被放置到内容展示器中,而不是当前的 属性 列。


您似乎覆盖了 AutoGeneratingColumn 那么为什么不简单地关闭自动生成并手动定义列呢?

这是一个工作版本,其中文本为数据换行:

<Window.Resources>
    <model:People x:Key="People">
        <model:Person First="Joe"   Last="Smith"   Phone="303-555 5555" />
        <model:Person First="Mary"  Last="Johnson" Phone="720-555 5555" />
        <model:Person First="Frank" Last="Wright"  Phone="202-555 5555" />
    </model:People>
</Window.Resources>
<DataGrid AutoGenerateColumns="False"
          ItemsSource="{StaticResource People}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="First" Binding="{Binding First}" />
        <DataGridTextColumn Header="The Name" Binding="{Binding Last}" />
        <DataGridTextColumn Header="Phone Number" Binding="{Binding Phone}">
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="TextBlock">
                    <Setter Property="TextWrapping"
                            Value="Wrap" />
                </Style>
            </DataGridTextColumn.ElementStyle>

        </DataGridTextColumn>
    </DataGrid.Columns>

</DataGrid>

结果