Je vais avoir cette même question et je ne vois pas pourquoi dans ma validation de cas est invoqué par la réflexion. Je considère l'une des deux solutions.
D'abord je pense à implémenter un convertisseur pour extraire le InnerException de l'exception ValidationError.Exception si nécessaire. Quelque chose comme ceci:
[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();
}
}
J'utilise le convertisseur sur le infobulle:
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors).CurrentItem, Converter={StaticResource ErrorContentConverter}}"/>
</Trigger>
Sinon, je pensais utiliser le UpdateSourceExceptionFilter sur la liaison. J'ai mis en place un filtre comme ci-dessous. Cette solution est un peu difficile à utiliser car vous devez définir la propriété UpdateSourceExceptionFilter dans le code derrière.
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);
}
Le convertisseur est simple mais ne modifie que le message affiché. Le filtre est une solution plus complète, mais il est difficile de travailler avec chaque liaison. Tous les commentaires seraient considérablement apprécié!
Merci
Bonne prise Stu! Si une liaison à Path = (Validation.Errors) [0] .Exception, j'obtiens dans l'info-bulle le message entier d'exception. Puis j'ai essayé de lier à: (Validation.Errors) [0] .Exception.InnerException.Message et j'ai enfin obtenu le excitement. Mais maintenant ...le comportement de ValidatesOnExcpetions est-il correct? – Drake
Il semble y avoir quelque chose d'étrange dans votre validation - je pense que vous devez déterminer pourquoi votre exception est enveloppée en premier lieu. La liaison à l'exception interne est un peu fragile car elle va cesser de fonctionner si vous avez des exceptions non emballées. –