При привязке к объекту, который поддерживает IDataErrorInfo, следует учитывать несколько особенностей класса привязки WPF:
ValidatesOnDataErrors должно быть True. Это указывает WPF искать и использовать интерфейс IDataError для базового объекта.
Присоединенное свойство Validation.HasError будет установлено в true для целевого объекта, если интерфейс IDataError исходного объекта сообщил о проблеме проверки. Затем вы можете использовать это свойство с триггером, чтобы изменить всплывающую подсказку элемента управления для отображения сообщения об ошибке проверки (я делаю это в моем текущем проекте, и конечный пользователь любит его)
Вложенное свойство Validation.Errors будет содержать перечисление любых ошибок ValidationResult, возникших в результате последней попытки проверки. Если вы используете подход всплывающей подсказки, используйте IValueConverter для извлечения только первого элемента ... в противном случае вы столкнетесь с ошибками связывания для отображения самого сообщения об ошибке.
Класс привязки предоставляет NotifyOnValidationError, которая при значении True приведет к тому, что перенаправленные события будут пузыриться из привязанного элемента управления каждый раз, когда изменяется состояние правила проверки. Это полезно, если вы хотите реализовать обработчик событий в контейнере связанных элементов управления, а затем добавить и удалить сообщения проверки в / из списка.
В MSDN есть примеры для выполнения обоих стилей обратной связи (всплывающие подсказки и список), но я вставлю ниже код, который я использовал, чтобы реализовать отзыв всплывающей подсказки для моих DataGridCells и TextBoxes ...
Стиль DataGridCell:
<Style TargetType="{x:Type dg:DataGridCell}"
x:Key="DataGridCellStyle">
<Setter Property="ToolTip"
Value="{Binding Path=Column.(ToolTipService.ToolTip),RelativeSource={RelativeSource Self}}" />
<Style.Triggers>
<Trigger Property="Validation.HasError"
Value="True">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors), Converter={StaticResource ErrorContentConverter}}" />
</Trigger>
</Style.Triggers>
</Style>
Стиль TextBox:
<Style x:Key="ValidatableTextBoxStyle" TargetType="TextBox">
<!--When the control is not in error, set the tooltip to match the AutomationProperties.HelpText attached property-->
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Mode=Self},Path=(AutomationProperties.HelpText)}" />
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
ErrorContentConverter (для получения первого сообщения об ошибке проверки для всплывающей подсказки):
Imports System.Collections.ObjectModel
Namespace Converters
<ValueConversion(GetType(ReadOnlyObservableCollection(Of ValidationError)), GetType(String))> _
Public Class ErrorContentConverter
Implements IValueConverter
Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
Dim errors As ReadOnlyObservableCollection(Of ValidationError) = TryCast(value, ReadOnlyObservableCollection(Of ValidationError))
If errors IsNot Nothing Then
If errors.Count > 0 Then
Return errors(0).ErrorContent
End If
End If
Return String.Empty
End Function
Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
Throw New NotImplementedException()
End Function
End Class
End Namespace
... и, наконец, пример использования стиля в текстовом поле:
<TextBox Text="{Binding Path=EstimatedUnits,ValidatesOnDataErrors=True,NotifyOnValidationError=True}"
Style="{StaticResource ValidatableTextBoxStyle}"
AutomationProperties.HelpText="The number of units which are likely to sell in 1 year." />