Я предполагаю, что у вас есть объект RowData, который содержит несколько объектов CellData, что вы связали ItemsSource DataGrid со списком объектов RowData и используете DataGridTextColumns или другие DataGridBoundColumns, связанные со свойствами в RowData,может быть, просто с помощью AutoGenerateColumns = "True".
Проблема в том, что DataContext для ячейки - это на самом деле RowData, а не CellData.Привязка используется только для свойства Text TextBlock и TextBox.Это полезно, если вы хотите, чтобы триггеры основывались на других свойствах объекта RowData, но затрудняют такие сценарии, как ваш, где у вас есть богатая структура данных для данных ячейки.
Если вы создаете столбцы явно, вы можете просто снова использовать свойство для столбца в триггере:
<DataGridTextColumn Binding="{Binding Foo}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Style.Triggers>
<!-- DataContext is the row, so start
binding path with Foo property -->
<DataTrigger Binding="{Binding Foo.Color}" Value="1">
<Setter Property="Background" Value="Red" />
<Setter Property="Foreground" Value="White" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
К сожалению, это не позволит вам разделить стиль между столбцамитак как это специфично для имени столбца.Если вы хотите сделать это, вам может понадобиться создать собственный подкласс DataGridColumn со свойством типа Binding, которое применяется к свойству DataContext объекта, возвращаемого GenerateElement и GenerateEditingElement.
(Использование привязки с RelativeSource of Self, как вы делали в своем примере, дает вам элемент в визуальном дереве, а не его DataContext, что не поможет вам добраться до объекта CellData.)