web-dev-qa-db-fra.com

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

À 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.

43
Aryan SuryaWansi

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.-->
42
RoelF

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.

32
ChrisF

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

3
Dominik