Quelle est l'utilisation de la méthode ConvertBack dans L'interface IValueConverter?

Quelle est l'utilisation de la méthode ConvertBack dans l'interface IValueConverter.

Quand il appellera?

Ou quel est l'ordre d'invocation de la méthode Convert et ConvertBack.

J'ai posé une question ici parce que: j'ai lié une propriété de codebehind à la propriété TextBox et en utilisant convertor pour cette propriété,

Puis d'abord Convert méthode invoke et quand je change TEXT dans TEXTBOX rien ne se passe mais dès que je ferme le formulaire ConvertBack la méthode invoke.

Qu'est-ce, il n'y a pas toutes les règles qui définissent quand le feu ConvertBack méthode?

NOTE: Vous trouverez peut-être que c'est possible en double d'une autre question sur ce site...mais pas n'importe quelle question que j'ai trouvé utilisation complète dans la liste de suggestions quand j'écris ma question.

38
demandé sur Aryan SuryaWansi 2011-06-21 14:50:43

3 réponses

IMO, la méthode ConvertBack est utilisée pour convertir votre représentation visuelle des données au type de données spécifique.

Par exemple: vous utilisez un convertisseur pour convertir un booléen true en chaîne "TrueBoolean". Ce texte sera affiché dans votre zone de texte. Lorsque vous modifiez la valeur de la zone de texte, 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 en le type de données que vous voulez qu'il soit. Ainsi, vous aurez à implémentez une logique pour convertir "FalseBoolean" en 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
A propos de vous question 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.-->
36
répondu RoelF 2011-06-21 11:20:16

ConvertBack c'est quand vous avez mode=TwoWay sur votre liaison.

Il convertit l'entrée de l'utilisateur dans le type de données auquel vous vous liez et est invoqué lorsque 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, des milliers séparateur 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 d'une chaîne unique de chiffres ou 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.

29
répondu ChrisF 2011-06-21 11:41:27

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 à jour par défaut la source si elle perd le focus, en utilisant UpdateSourceTrigger, vous pouvez définir ce comportement sur la mise à jour immédiate de la source si le contenu de la zone de texte change.

HTH Dominik

3
répondu Dominik 2012-07-03 16:39:43