132 votes

Est-il possible de chaîner plusieurs convertisseurs de valeur dans le code XAML?

J'ai une situation dans laquelle j'ai besoin d'afficher un entier de valeur, lié à une propriété sur mes données de contexte, après mettre à travers deux conversions:

  1. Inverser la valeur dans une plage (par exemple la gamme de 1 à 100; valeur en datacontext est 90; l'utilisateur voit la valeur de 10)
  2. convertir le nombre en une chaîne de caractères

Je me rends compte que je pouvais faire les deux étapes en créant mon propre convertisseur (qui implémente IValueConverter). Cependant, j'ai déjà une valeur distincte, le convertisseur est juste la première étape et la deuxième étape est couvert par Int32Converter.

Est il possible que je peux enchainer ces deux classes existantes dans le code XAML , sans avoir à créer une nouvelle classe qui agrégats?

Si j'ai besoin de clarifier tout cela, s'il vous plaît laissez-moi savoir. :)

Merci.

203voto

Town Points 9331

J'ai utilisé cette méthode par Gareth Evans dans mon projet Silverlight.

Voici ma mise en œuvre de celui-ci:

public class ValueConverterGroup : List<IValueConverter>, IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return this.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }

Qui peut ensuite être utilisé dans le code XAML comme ceci:

<c:ValueConverterGroup x:Key="InvertAndVisibilitate">
   <c:BooleanInverterConverter/>
   <c:BooleanToVisibilityConverter/>
</c:ValueConverterGroup>

55voto

Mal Ross Points 1732

Trouvé exactement ce que je cherchais, avec l'aimable autorisation de Josh Smith: la Tuyauterie des Convertisseurs de Valeur.

Il définit un ValueConverterGroup classe, dont l'usage dans le XAML est exactement comme je l'espérais. Voici un exemple:

<!-- Converts the Status attribute text to a SolidColorBrush used to draw 
     the output of statusDisplayNameGroup. -->
<local:ValueConverterGroup x:Key="statusForegroundGroup">
  <local:IntegerStringToProcessingStateConverter  />
  <local:ProcessingStateToColorConverter />
  <local:ColorToSolidColorBrushConverter />
</local:ValueConverterGroup> 

De grandes choses. Merci, Josh. :)

6voto

wpfwannabe Points 4671

Oui, il existe des moyens de la chaîne des convertisseurs, mais il n'a pas l'air joli et vous n'avez pas besoin de lui ici. Si jamais vous venez de besoin, demandez-vous, est-ce 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 devez faire est de formater une valeur convertie en une chaîne. StringFormat de la propriété sur un Binding est votre ami ici.

 <TextBlock Text="{Binding Value,Converter={StaticResource myConverter},StringFormat=D}" />

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X