在 WPF DataGrid 的单个单元格上设置删除线的最佳方法?
Posted
技术标签:
【中文标题】在 WPF DataGrid 的单个单元格上设置删除线的最佳方法?【英文标题】:Best way to set a strikethrough on individual cells of the WPF DataGrid? 【发布时间】:2011-08-09 12:08:07 【问题描述】:在 WPF DataGrid 的单个单元格上将字体设置为删除线样式的最佳(简单)方法是什么?
...
我知道的选项是在单个单元格中插入 TextBlock 控件或使用 DataGridTemplateColumn - 并在其中使用 TextDecorations 属性。无论哪种方式,这都是一项艰巨的任务,我想使用 DataGrid 的默认 AutoGenerate Columns 功能,特别是因为我的 ItemsSource 是一个 DataTable。
顺便说一句,有没有办法访问使用默认 DataGridTextColumn 生成的 TextBlock?
【问题讨论】:
【参考方案1】:<DataGridTextColumn Binding="Binding Name">
<DataGridTextColumn.ElementStyle>
<Style TargetType="x:Type TextBlock">
<Setter Property="TextDecorations" Value="Strikethrough"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
当然,您可以将 setter 包装在 DataTrigger 中以选择性地使用它。
【讨论】:
这是一个很好的方法,如果你正在做整个列,你有一个很好的方法来做单个单元格吗?同样在我的情况下,我需要在后面的代码中执行此操作,因为我没有任何容易将 DataGridTextColumn 绑定到的东西。 正如我所说,使用 DataTrigger 将其限制在某些单元格中,并且在后面的代码中这样做也不应该是一个问题,这只是一个翻译问题。【参考方案2】:如果要根据特定单元格绑定删除线,则会遇到绑定问题,因为 DataGridTextColumn.Binding 仅更改 TextBox.Text 的内容。如果您只需要 Text 属性的值,您可以绑定到 TextBox 本身:
<Setter Property="TextDecorations"
Value="Binding RelativeSource=RelativeSource Self,
Path=Text,
Converter=StaticResource TextToTextDecorationsConverter" />
但是如果你想绑定到不同于 TextBox.Text 的东西,你必须通过 DataGridRow 进行绑定,它是可视化树中 TextBox 的父级。 DataGridRow 有一个 Item 属性,可以访问用于整行的完整对象。
<Setter Property="TextDecorations"
Value="Binding RelativeSource=RelativeSource AncestorType=x:Type DataGridRow,
Path =Item.SomeProperty,
Converter=StaticResource SomePropertyToTextDecorationsConverter" />
转换器看起来像这样,假设某些东西是布尔类型:
public class SomePropertyToTextDecorationsConverter: IValueConverter
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
if (value is bool)
if ((bool)value)
TextDecorationCollection redStrikthroughTextDecoration =
TextDecorations.Strikethrough.CloneCurrentValue();
redStrikthroughTextDecoration[0].Pen =
new Pen Brush=Brushes.Red, Thickness = 3 ;
return redStrikthroughTextDecoration;
return new TextDecorationCollection();
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
throw new NotImplementedException();
【讨论】:
以上是关于在 WPF DataGrid 的单个单元格上设置删除线的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章