web-dev-qa-db-fra.com

Comment lier plusieurs valeurs à un seul WPF TextBlock?

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 ne autre propriété nommée ID à la 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, comme Name + ID et, sinon, comment pourrait-on l’aborder autrement?

182
Spen D

Vous pouvez utiliser un MultiBinding combiné à la propriété StringFormat . L'utilisation ressemblerait à ceci:

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

Avec une valeur de Nom de Foo et une valeur pour ID de _1_, le résultat affiché dans le TextBlock serait _Foo + 1_.

Note: cela n'est pris en charge que par .NET 3.5 SP1 et 3.0 SP2 ou version ultérieure.

391
Richard McGuire

Je sais que nous sommes en retard, mais je pensais ajouter une autre façon de procéder.

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

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

Si ce ne sont que des blocs de texte (et donc une liaison à sens unique) et que vous souhaitez simplement concaténer des valeurs, liez simplement deux blocs de texte et placez-les dans un panneau de pile horizontal.

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

Cela affichera le texte (ce que font tous les Textblocks) sans avoir à coder davantage. Vous pouvez toutefois leur attribuer une petite marge pour leur donner une apparence correcte.

21
CodeWarrior

Utilisez un ValueConverter

[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}}" />
11
Preet Sangha