2010-03-31 6 views
146

J'utilise actuellement le TextBlock ci-dessous pour lier la valeur d'une propriété nommée Name:Comment lier plusieurs valeurs à un seul TextBlock WPF?

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

Maintenant, je veux lier une autre propriété nommée ID au même TextBlock. Est-il possible de lier deux ou plusieurs valeurs à la même TextBlock? Peut-il être fait avec une concaténation simple, comme Name + ID et, sinon, comment pourrait-il être approché autrement?

Répondre

323

Vous pouvez utiliser un MultiBinding combiné avec la propriété StringFormat. Utilisation ressemblerait à ce qui suit:

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

Etant donnée une valeur de nom de Foo et une valeur pour l'identification de 1 vous émettez dans le TextBlock serait Foo + 1.

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

+6

Sur l'interst, que fait le {} dans le format? –

+5

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

+1

Il y a un effet secondaire à cela. Si vous utilisez cette méthode dans quelque chose comme un comportement de tri 'DataGrid', cela 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 que c'est un moyen facile de formater rapidement mais un peu verbeux. –

9

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}}" /> 
+0

Est-ce que cela fonctionne? Où vous liez-vous à l'identification? – waxingsatirical

+0

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

16

Si ce ne sont que des blocs de texte (et donc une liaison à sens unique), et que vous voulez simplement concaténer des valeurs, il suffit de lier deux blocs de texte et de les placer 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 blocs de texte) sans avoir à coder davantage. Vous pourriez mettre une petite marge sur eux pour les faire paraître bien.

98

Je sais que c'est un moyen en retard, mais je pensais que j'ajouterais encore une autre façon de le faire.

Vous pouvez tirer parti du fait que la propriété Text peut être définie à l'aide de "Run s", vous pouvez donc définir plusieurs liaisons à l'aide d'une exécution pour chacune. 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> 
+3

Il s'agit d'une approche très pratique à utiliser lors de la liaison à plusieurs chaînes qui sont source comme DynamicResource que vous pouvez n'utilisez pas MultiBinding avec StringFormat pour cela. – slugster

+6

Ne fonctionne qu'avec .NET 4.0+ – Doug

+0

Je viens de l'essayer. Cela fonctionne, cependant chaque élément (même la géométrie) qui est dessiné (sur un rafraîchissement) clignote maintenant chaque tick pour une raison quelconque. Va essayer l'autre méthode. –

Questions connexes