在 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 的单个单元格上设置删除线的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在WPF DataGrid上处理单元格双击事件,相当于Windows DataGrid的事件?

如何在 WPF 数据网格中选择单个单元格?

在 WPF 中的 dataGridCells 上设置填充

wpf datagrid 单元格如何默认单击一次点中

如何获取 WPF DataGrid 的单元格级别组合框?

无法编辑我的 DataGrid WPF Framework 4.5 的单元格