À quoi sert la méthode ConvertBack
dans l'interface IValueConverter
.
Quand sera-t-il appelé?
Ou quelle est la ordre d'invocation des méthodes Convert
et ConvertBack
?
J'ai posé la question ici parce que: J'ai lié ne propriété de codebehind à la propriété TEXT de TEXTBOX et j'utilise convertor
pour cette propriété. La première méthode Convert
invoque et quand je change TEXT
dans TEXTBOX
rien ne se passe ... mais dès que je ferme le formulaire, la méthode ConvertBack
invoque.
IMO, la méthode ConvertBack
est utilisée pour convertir votre représentation visuelle des données en DataType spécifique.
Par exemple: vous utilisez un convertisseur pour convertir un booléen true
en chaîne "TrueBoolean"
. Ce texte sera affiché dans votre TextBox. Lorsque vous modifiez la valeur de TextBox, la méthode ConvertBack
sera appelée dès que la liaison se déclenchera à nouveau (OnFocusLost par défaut). Maintenant, votre méthode ConvertBack
va essayer de convertir la nouvelle valeur dans le type de données que vous voulez qu'elle soit. Vous devrez donc implémenter une logique pour convertir "FalseBoolean"
à false
.
public class Converter : IValueConverter
{
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool) value ? "TrueBoolean" : "FalseBoolean";
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
var s = (string) value;
if (s.Equals("TrueBoolean",StringComparison.CurrentCultureIgnoreCase))
return true;
if (s.Equals("FalseBoolean", StringComparison.CurrentCultureIgnoreCase))
return false;
throw new Exception(string.Format("Cannot convert, unknown value {0}", value));
}
}
Cette technique est beaucoup utilisée dans DataGrids si je ne me trompe pas.
J'espère que c'est un peu clair ...
MISE À JOUR
Question à propos de vous dans le commentaire:
Pour remplacer le comportement de liaison par défaut OnFocusLost
, vous devez modifier votre liaison comme ceci:
<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/>
<!--syntax might differ, can't access VS at the moment.-->
ConvertBack
c'est quand vous avez mode=TwoWay
sur votre reliure.
Il reconvertit l'entrée utilisateur dans le type de données auquel vous vous liez et est invoqué lorsque le TextBox
(disons) perd le focus.
Par exemple (si cela n'a pas été intégré), si vous avez un nombre qui représente un prix, la méthode Convert
prendrait la valeur et la formaterait en une chaîne avec le symbole monétaire correct, le séparateur décimal, etc.
Si l'utilisateur saisit une nouvelle valeur - y compris un symbole monétaire possible, un séparateur de milliers, etc., vous utiliseriez la méthode ConvertBack
pour analyser la chaîne et extraire la valeur numérique.
Un autre exemple pourrait être la saisie du numéro de carte de crédit. L'utilisateur peut entrer le numéro sous la forme d'une seule chaîne de chiffres ou de groupes de chiffres séparés par des espaces ou des tirets. La méthode ConvertBack
prendrait toutes ces entrées possibles et les convertirait au format unique dont vous avez besoin.
vérifiez la propriété UpdateSourceTrigger sur votre liaison. http://msdn.Microsoft.com/library/system.windows.data.binding.updatesourcetrigger.aspx
La zone de texte mettra par défaut à jour la source si elle perd le focus, en utilisant UpdateSourceTrigger, vous pouvez définir ce comportement pour une mise à jour immédiate de la source si le contenu de la zone de texte change.
HTH Dominik