在WPF DataGrid的单个单元格上设置划线的最佳方法

本文关键字:最佳 方法 设置 单元格 WPF DataGrid 单个 | 更新日期: 2023-09-27 17:50:35

在WPF DataGrid的单个单元格上设置字体为划线样式的最佳(简单)方法是什么?

选项,我知道是插入TextBlock控件在单个单元格或使用datagridtemplatecoluml -并使用其中的text装饰品属性。无论哪种方式,这都是一个相当大的任务,我想使用默认的DataGrid自动生成列功能,特别是因为我的ItemsSource是一个数据表。

作为和一边,有任何方法来访问使用默认的DataGridTextColumn生成的TextBlock ?

在WPF DataGrid的单个单元格上设置划线的最佳方法

<DataGridTextColumn Binding="{Binding Name}">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="TextDecorations" Value="Strikethrough"/>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

当然,你可以把setter包在DataTrigger中,以便有选择地使用它

如果您想要绑定基于特定单元格的划线,您就会遇到绑定问题,因为DataGridTextColumn。绑定只改变TextBox.Text的内容。如果Text属性的值是你所需要的,你可以绑定到TextBox本身:

<Setter Property="TextDecorations" 
  Value="{Binding RelativeSource={RelativeSource Self}, 
  Path=Text, 
  Converter={StaticResource TextToTextDecorationsConverter}}" />

但是如果你想绑定到不同于TextBox的东西。文本,您必须通过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();
    }
  }