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>
结果
我有一个带有自动生成列的 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>
结果