У меня такая же проблема, и я не понимаю, почему в моем случае проверка вызывается через рефлексию. Я рассматриваю одно из двух решений.
Сначала я собираюсь реализовать конвертер для извлечения InnerException из ValidationError.Exception, когда это необходимо. Примерно так:
[ValueConversion(typeof(ValidationError), typeof(string))]
public class ErrorContentConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var validationError = (ValidationError)value;
if ((validationError.Exception == null) || (validationError.Exception.InnerException == null))
return validationError.ErrorContent;
else
return validationError.Exception.InnerException.Message;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
Я использую конвертер в подсказке:
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors).CurrentItem, Converter={StaticResource ErrorContentConverter}}"/>
</Trigger>
В качестве альтернативы я подумал использовать UpdateSourceExceptionFilter для Binding. Я реализовал фильтр, как показано ниже. Это решение довольно неудобно, потому что вы должны установить свойство UpdateSourceExceptionFilter в коде позади.
object InnerExceptionFilter(object bindingExpression, Exception exception)
{
if (exception.InnerException != null)
{
var be = (System.Windows.Data.BindingExpression)bindingExpression;
var rule = be.ParentBinding.ValidationRules.First(x=>x is ExceptionValidationRule);
return new ValidationError(rule, be, exception.InnerException.Message, exception.InnerException);
}
else
return exception;
}
usage:
public MyConstructor()
{
myTextBox.GetBindingExpression(TextBox.TextProperty).ParentBinding.UpdateSourceExceptionFilter
= new UpdateSourceExceptionFilterCallback(InnerExceptionFilter);
}
Преобразователь прост, но изменяет только отображаемое сообщение. Фильтр является более полным решением, но с ним недружелюбно работать с каждой привязкой. Любые комментарии будут очень оценен!
Спасибо