在WPF DataGrid的单个单元格上将字体设置为删除线样式的最佳(简单)方法是什么?
...
我知道的选项是在单个单元格中插入TextBlock控件或使用DataGridTemplateColumn - 并在其中使用TextDecorations属性。无论哪种方式,这都是一项使命,我想使用DataGrid的默认AutoGenerate Columns函数,特别是因为我的ItemsSource是一个DataTable。
除此之外,有没有办法访问使用默认DataGridTextColumn生成的TextBlock?
答案 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();
}
}