Не использовать Mode=TwoWay
для DataGridTextColumns
решает одну версию проблемы, однако, похоже, что эта проблема может появиться из ниоткуда и по другим причинам.
(Любой, у кого есть хорошее объяснение, почему не использовать Mode=TwoWay
, прежде всего, решает эту проблему, вероятно, близок к решению этой проблемы)
То же самое произошло со мной с DataGridComboBoxColumn
, поэтому я попытался копнуть немного глубже.
Проблема не в Binding
в Control
, который отображает ErrorTemplate
внутри DataGridHeaderBorder
. Он привязывает Visibility
к Validation.HasError
для предка DataGridRow
(именно так, как и должно быть), и эта часть работает.
Visibility="{Binding (Validation.HasError),
Converter={StaticResource bool2VisibilityConverter},
RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}"/>
Проблема в том, что ошибка проверки не удаляется из DataGridRow
после ее устранения. В моей версии проблемы DataGridRow
начинался с 0 ошибок. Когда я ввел неверное значение, он получил 1 ошибку, так что пока все хорошо. Но когда я исправил ошибку, она поднялась до 3 ошибок, все из которых были одинаковыми.
Здесь я попытался разрешить его с помощью DataTrigger
, который установил ValidationErrorTemplate
в {x:Null}
, если Validation.Errors.Count
не было 1. Это отлично работало для первой итерации, но как только я очистил ошибку во второй раз это было назад. Больше не было 3 ошибок, было 7! Еще через пару итераций он был выше 10.
Я также попытался стереть ошибки вручную, выполнив UpdateSource
и UpdateTarget
на BindingExpressions
, но без игры в кости. Validation.ClearInvalid
тоже не имел никакого эффекта. И просмотр исходного кода в наборе инструментов меня ни к чему не привел:)
Так что у меня нет хороших решений, но я все равно решил опубликовать свои выводы ..
Мой единственный «обходной путь» на данный момент - просто скрыть ErrorTemplate
в DataGridRowHeader
<DataGrid ...>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="ValidationErrorTemplate" Value="{x:Null}"/>
</Style>
</DataGrid.RowStyle>
<!-- ... -->
</DataGrid>