Лучший способ установить зачеркивание для отдельных ячеек WPF DataGrid? - PullRequest
6 голосов
/ 20 апреля 2011

Каков наилучший (простой) способ установки шрифта в зачеркнутом стиле для отдельных ячеек WPF DataGrid?

...

Мне известны варианты вставки элементов управления TextBlock в отдельные ячейки или использования DataGridTemplateColumn - и использования в них свойства TextDecorations. В любом случае, это довольно сложная задача, я бы хотел использовать функцию AutoGenerate Columns по умолчанию в DataGrid, тем более что мой ItemsSource является DataTable.

Кроме того, есть ли способ получить доступ к TextBlock, созданному с использованием DataGridTextColumn по умолчанию?

Ответы [ 2 ]

6 голосов
/ 20 апреля 2011
<DataGridTextColumn Binding="{Binding Name}">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="TextDecorations" Value="Strikethrough"/>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>

Конечно, вы можете обернуть сеттер в DataTrigger, чтобы использовать его выборочно.

0 голосов
/ 17 ноября 2013

Если вы хотите привязать зачеркивание на основе определенной ячейки, у вас есть проблема с привязкой, потому что DataGridTextColumn.Binding изменяет только содержимое TextBox.Text.Если значение свойства Text - это все, что вам нужно, вы можете связать его с самим TextBox:

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

Но если вы хотите связать что-то отличное от TextBox.Text, вам нужно связать через DataGridRow,который является родителем TextBox в визуальном дереве.DataGridRow имеет свойство Item, которое дает доступ ко всему объекту, используемому для всей строки.

<Setter Property="TextDecorations" 
  Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, 
  Path =Item.SomeProperty, 
  Converter={StaticResource SomePropertyToTextDecorationsConverter}}" />

Преобразователь выглядит следующим образом, предполагая, что что-то имеет тип 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();
    }
  }
...