c# - ¿La mejor manera de establecer un tachado en celdas individuales de WPF DataGrid?
xaml strikethrough (2)
Si desea vincular el tachado en función de una celda en particular, tiene un problema vinculante, porque DataGridTextColumn.Binding cambia solo el contenido de TextBox.Text. Si el valor de la propiedad Text es todo lo que necesita, puede vincularse al TextBox mismo:
<Setter Property="TextDecorations"
Value="{Binding RelativeSource={RelativeSource Self},
Path=Text,
Converter={StaticResource TextToTextDecorationsConverter}}" />
Pero si desea vincularse a algo diferente de TextBox.Text, debe enlazar a través de DataGridRow, que es un elemento primario de TextBox en el árbol visual. DataGridRow tiene una propiedad Item, que da acceso al objeto completo utilizado para toda la fila.
<Setter Property="TextDecorations"
Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}},
Path =Item.SomeProperty,
Converter={StaticResource SomePropertyToTextDecorationsConverter}}" />
El convertidor se ve así, suponiendo que algo es de tipo booleano:
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();
}
}
¿Cuál es la mejor (fácil) forma de establecer la fuente en un estilo de tachado en celdas individuales de WPF DataGrid?
...
Las opciones de las que tengo conocimiento son insertar controles TextBlock en celdas individuales o usar una DataGridTemplateColumn y usar la propiedad TextDecorations allí. De cualquier forma, esta es toda una misión. Me gustaría usar la función de columnas de AutoGenerar predeterminado de DataGrid, especialmente dado que ItemsSource es una DataTable.
Como y aparte, ¿hay alguna forma de acceder al TextBlock generado usando DataGridTextColumn por defecto?
<DataGridTextColumn Binding="{Binding Name}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="TextDecorations" Value="Strikethrough"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
Por supuesto, puede envolver el colocador en un DataTrigger para usarlo selectivamente.