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

时间:2011-04-20 13:09:34

标签: c# wpf xaml datagrid strikethrough

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

...

我知道的选项是在单个单元格中插入TextBlock控件或使用DataGridTemplateColumn - 并在其中使用TextDecorations属性。无论哪种方式,这都是一项使命,我想使用DataGrid的默认AutoGenerate Columns函数,特别是因为我的ItemsSource是一个DataTable。

除此之外,有没有办法访问使用默认DataGridTextColumn生成的TextBlock?

2 个答案:

答案 0 :(得分:6)

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

当然,您可以将setter包装在DataTrigger中以有选择地使用它。

答案 1 :(得分:0)

如果要基于特定单元格绑定删除线,则存在绑定问题,因为DataGridTextColumn.Binding仅更改TextBox.Text的内容。如果您需要Text属性的值,则可以绑定到TextBox本身:

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

但是如果要绑定到与TextBox.Text不同的东西,则必须通过DataGridRow进行绑定,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();
    }
  }