If you want to bind strikethrough based on a specific cell, you have a bind problem because DataGridTextColumn.Binding only modifies the contents of TextBox.Text. If the value of the Text property is all you need, you can bind to the TextBox itself:
<Setter Property="TextDecorations" Value="{Binding RelativeSource={RelativeSource Self}, Path=Text, Converter={StaticResource TextToTextDecorationsConverter}}" />
But if you want to bind to something other than TextBox.Text, you need to bind through DataGridRow, which is the parent of the TextBox in the visual tree. The DataGridRow has an Item property that gives access to the full object used for the entire row.
<Setter Property="TextDecorations" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path =Item.SomeProperty, Converter={StaticResource SomePropertyToTextDecorationsConverter}}" />
The converter looks like this: it is assumed that something is of type boolean:
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(); } }
source share