J'utilise la solution présentée ici pour la liaison des erreurs en natif Exceptions: http://www.jasonbock.net/jb/Default.aspx?blog=entry.0f221e047de740ee90722b248933a28d
Cependant, un scénario normal dans WPF liaisons est de lever des exceptions dans le cas où la saisie de l'utilisateur ne peut pas être converti vers le type de cible (par exemple, une zone de texte lié à un champ de type entier; l'entrée d'un non-numérique de la chaîne de résultats dans un FormatException la saisie d'un nombre trop grand de résultats dans un OverflowException). Un cas similaire est quand le Setter de la propriété de la source de renvoie une exception.
WPF moyen de ce traitement est via ValidatesOnExceptions=true et ValidationExceptionRule pour signaler à l'utilisateur la fourniture d'entrée n'est pas correcte (en utilisant le message de l'exception).
Toutefois, ces exceptions sont également envoyer à la fenêtre de sortie et donc "pris" par le BindingListener, ce qui entraîne une erreur...clairement pas le comportement que vous voulez.
Donc, j'ai élargi l' BindingListener
classe pour ne PAS jeter une Exception dans ces cas:
private static readonly IList<string> m_MessagesToIgnore =
new List<String>()
{
//Windows.Data.Error 7
//Binding transfer from target to source failed because of an exception
//Normal WPF Scenario, requires ValidatesOnExceptions / ExceptionValidationRule
//To cope with these kind of errors
"ConvertBack cannot convert value",
//Windows.Data.Error 8
//Binding transfer from target to source failed because of an exception
//Normal WPF Scenario, requires ValidatesOnExceptions / ExceptionValidationRule
//To cope with these kind of errors
"Cannot save value from target back to source"
};
Les lignes modifiées dans le public override void WriteLine(string message):
....
if (this.InformationPropertyCount == 0)
{
//Only treat message as an exception if it is not to be ignored
if (!m_MessagesToIgnore.Any(
x => this.Message.StartsWith(x, StringComparison.InvariantCultureIgnoreCase)))
{
PresentationTraceSources.DataBindingSource.Listeners.Remove(this);
throw new BindingException(this.Message,
new BindingExceptionInformation(this.Callstack,
System.DateTime.Parse(this.DateTime),
this.LogicalOperationStack, int.Parse(this.ProcessId),
int.Parse(this.ThreadId), long.Parse(this.Timestamp)));
}
else
{
//Ignore message, reset values
this.IsFirstWrite = true;
this.DetermineInformationPropertyCount();
}
}
}