J'ai une situation dans laquelle je dois afficher une valeur entière, liée à une propriété sur mon contexte de données, après l'avoir soumise à deux conversions distinctes:
- Inverser la valeur dans une plage (par exemple, la plage est de 1 à 100; la valeur dans datacontext est 90; l'utilisateur voit la valeur de 10)
- convertir le nombre en chaîne
Je me rends compte que je pourrais faire les deux étapes en créant mon propre convertisseur (qui implémente IValueConverter). Cependant, j'ai déjà un convertisseur de valeur séparé qui ne fait que la première étape, et la deuxième étape est couverte par Int32Converter.
Existe-t-il un moyen de chaîner ces deux classes existantes en XAML sans avoir à créer une autre classe qui les agrège?
Si j'ai besoin de clarifier quelque chose de cela, veuillez me le faire savoir. :)
Merci.
la source
return this.Reverse<IValueConverter>().Aggregate(value, (current, converter) => converter.ConvertBack(current, targetType, parameter, culture));
J'ai trouvé exactement ce que je cherchais, avec l'aimable autorisation de Josh Smith: Piping Value Converters (lien archive.org) .
Il définit une
ValueConverterGroup
classe dont l'utilisation en XAML correspond exactement à ce que j'espérais. Voici un exemple:Super truc. Merci Josh. :)
la source
L'implémentation par Town du projet Silverlight de Gareth Evans est excellente, mais elle ne prend pas en charge différents paramètres de conversion.
Je l'ai modifié pour que vous puissiez fournir des paramètres séparés par des virgules (à moins que vous ne les échappiez bien sûr).
Convertisseur:
Remarque: ConvertBack n'est pas implémenté ici, voir mon Gist pour la version complète.
La mise en oeuvre:
la source
Oui, il existe des moyens de chaîner les convertisseurs, mais cela n'a pas l'air joli et vous n'en avez pas besoin ici. Si jamais vous en avez besoin, demandez-vous si c'est vraiment la voie à suivre? Simple fonctionne toujours mieux même si vous devez écrire votre propre convertisseur.
Dans votre cas particulier, tout ce que vous avez à faire est de formater une valeur convertie en chaîne.
StringFormat
la propriété sur unBinding
est votre ami ici.la source
Voici une petite extension de la réponse de Town pour prendre en charge la multi-liaison:
la source