Вероятно, немного поздно, но, поскольку у меня возникают проблемы такого же рода, вот обходной путь для дальнейшего ознакомления (протестировано с .NET 4.0.30319).
1) Поймать исключение
Хотя следующий код привязки в исходном сообщении прекрасно работает с TextBox, например, он не работает с текстовой ячейкой DataGrid (хотя в документации Msn об этом говорится):
<!-- Doesn't work -->
<DataGridTextColumn Binding="{Binding Path=Age, ValidatesOnExceptions=True}"
...
/>
Вы должны добавить этот бит:
<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
...
/>
Обратите внимание, что, как ни странно (для меня в любом случае), исключение будет перехвачено и показано с восклицательным знаком в заголовке строки. У вас просто не будет красной границы или возможности применить стиль без части Mode=TwoWay
.
2) Применение стиля
Другая сложность заключается в установке стиля в случае ошибки, поскольку элемент редактирования закроется, как только вы начнете процесс проверки. Так что прикрепление стиля с помощью:
<!-- Doesn't work -->
<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
EditingElementStyle="{StaticResource datagridTBStyle}"
...
/>
просто не будет работать, если вы захотите вызвать ошибку проверки. Аналогично с CellStyle, у которого не будет флага ошибки для запуска. Вы должны использовать трюк и объявить стиль FrameworkElement, например так:
<DataGridTextColumn Binding="{Binding Path=Age, Mode=TwoWay, ValidatesOnExceptions=True}"
ElementStyle="{StaticResource datagridElemStyle}"
...
/>
Хорошей новостью является то, что вы можете определить стиль для производного элемента, такого как TextBlock, и воспользоваться его свойствами:
<Style x:Key="datagridElemStyle" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background" Value="Yellow" />
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>