258 votes

Comment lier plusieurs valeurs à un seul bloc de texte WPF ?

J'utilise actuellement le TextBlock ci-dessous pour lier la valeur d'une propriété nommée Name :

<TextBlock Text="{Binding Name}" />

Maintenant, je veux lier un autre propriété nommée ID au même TextBlock .

Est-il possible de lier deux ou plusieurs valeurs à la même TextBlock ? Peut-on le faire avec une simple concaténation, par exemple Name + ID et, si ce n'est pas le cas, comment pourrait-on aborder la question autrement ?

528voto

Richard C. McGuire Points 3345

Vous pouvez utiliser un MultiBinding combiné avec le StringFormat propriété. L'utilisation ressemblerait à ce qui suit :

<TextBlock>
    <TextBlock.Text>    
        <MultiBinding StringFormat="{}{0} + {1}">
            <Binding Path="Name" />
            <Binding Path="ID" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Donner Name une valeur de Foo et ID une valeur de 1 votre résultat dans le bloc de texte serait alors le suivant Foo + 1 .

Note: que cela n'est pris en charge que dans .NET 3.5 SP1 et 3.0 SP2 ou plus.

5 votes

@Preet - Je ne suis pas certain que le '{}' soit nécessaire dans ce cas, je l'ai inclus car il était utilisé dans l'échantillon MSDN. En général, cependant, il est nécessaire comme séquence d'échappement pour l'analyseur XAML afin d'éviter toute confusion avec l'extension de balisage Binding.

2 votes

Il y a un effet secondaire à cela. Si vous utilisez cette méthode dans quelque chose comme un DataGrid Le comportement de triage ne fonctionne malheureusement pas. Une solution plus appropriée serait de créer une propriété en lecture seule dans votre modèle avec le format de chaîne approprié à lier. Inutile de dire qu'il s'agit d'un moyen efficace de formater rapidement, même s'il est un peu verbeux.

44 votes

Vous avez juste besoin de {} lorsque la chaîne de format commence par le paramètre {0}, il n'est pas nécessaire si la chaîne de format commence par un texte. ex : "{}{0} + {1}" "Page {0} de {1}"

169voto

Patrick Points 6834

Je sais que c'est un peu tard, mais j'ai pensé ajouter une autre façon de faire.

Vous pouvez tirer parti du fait que la propriété Text peut être définie en utilisant " Exécuter s", de sorte que vous pouvez configurer plusieurs liaisons en utilisant un Run pour chacune d'entre elles. C'est utile si vous n'avez pas accès à MultiBinding (que je n'ai pas trouvé en développant pour Windows Phone).

<TextBlock>
  <Run Text="Name = "/>
  <Run Text="{Binding Name}"/>
  <Run Text=", Id ="/>
  <Run Text="{Binding Id}"/>
</TextBlock>

5 votes

Il s'agit d'une approche très pratique à utiliser lorsque l'on se lie à plusieurs chaînes qui proviennent d'une DynamicResource, car vous ne pouvez pas utiliser un MultiBinding avec StringFormat pour cela.

0 votes

Je viens d'essayer ceci. Cela fonctionne, mais chaque élément (même la géométrie) qui est dessiné (lors d'un rafraîchissement) clignote maintenant à chaque tick pour une raison quelconque. Je vais essayer l'autre méthode.

9 votes

Cela peut devenir difficile si le texte doit être localisé parce que l'ordre est codé en dur.

26voto

CodeWarrior Points 3541

S'il ne s'agit que de blocs de texte (et donc d'une liaison unidirectionnelle), et que vous souhaitez simplement concaténer des valeurs, il suffit de lier deux blocs de texte et de les placer dans un panneau horizontal.

    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding ID}"/>
    </StackPanel>

Cela permettra d'afficher le texte (ce que font les blocs de texte) sans avoir à coder davantage. Vous pouvez cependant leur ajouter une petite marge pour qu'ils aient l'air correct.

13voto

Preet Sangha Points 39414

Utilisez un Convertisseur de valeurs

[ValueConversion(typeof(string), typeof(String))]
public class MyConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format("{0}:{1}", (string) value, (string) parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {

        return DependencyProperty.UnsetValue;
    }
}

et dans le balisage

<src:MyConverter x:Key="MyConverter"/>

. . .

<TextBlock Text="{Binding Name, Converter={StaticResource MyConverter Parameter=ID}}" />

0 votes

Oui, cela a été écrit il y a 6 ans, et vous liez le "Nom" comme premier argument au convertisseur (appelé valeur dans le code), et l'ID (une chaîne de la question) comme second argument.

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