2010-03-31 18 views
146

Actualmente estoy usando el TextBlock abajo para enlazar el valor de una propiedad denominada Name:¿Cómo vincular múltiples valores a un solo WPF TextBlock?

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

Ahora, quiero unir otra propiedad denominada ID a la misma TextBlock.

¿Es posible vincular dos o más valores al mismo TextBlock? ¿Se puede hacer con una concatenación simple, como Name + ID y, de no ser así, de qué otra manera podría abordarse?

Respuesta

323

Se puede utilizar un MultiBinding combinada con la propiedad StringFormat. Uso sería similar a la siguiente:

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

dado un valor de Nombre de Foo y un valor de ID de 1 que la producción en el TextBlock sería Foo + 1.

Note: que esto sólo es compatible con .NET 3.5 SP1 y 3.0 SP2 o posterior.

+6

OUt of interst ¿qué hace {} en el formato? –

+5

@Preet: en realidad no estoy seguro de si el '{}' es necesario en este caso, lo incluí desde que se usó en el ejemplo de MSDN. Sin embargo, en general, se necesita como una secuencia de escape para el analizador XAML para evitar confusiones con la extensión de marcado de enlace. –

+1

Hay un efecto secundario en esto. Si utiliza este método en algo así como un comportamiento de clasificación 'DataGrid' desafortunadamente no funciona.Una solución más adecuada sería crear una propiedad de solo lectura en su modelo con el formato de cadena apropiado para vincular. Huelga decir que esta es una manera ordenada de formatear rápidamente aunque sea un poco detallado. –

9

Utilice 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; 
    } 
} 

y en el marcado

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

. . .

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

hace este trabajo? ¿Dónde estás vinculando a la identificación? – waxingsatirical

+0

Sí, esto fue escrito hace 6 años, y está vinculando el "Nombre" como primer argumento al convertidor (llamado valor en el código), y el ID (una cadena de la pregunta) como el segundo argumento. –

16

Si estos solo van a ser bloques de texto (y por lo tanto unidireccionales), y solo desea concatenar valores, solo una dos bloques de texto y colóquelos en un panel de distribución horizontal.

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

Eso mostrará el texto (que es todo lo que hace Textblocks) sin tener que hacer ninguna codificación adicional. Puede ponerles un pequeño margen para que se vean bien.

98

Sé que esta es una forma tarde, pero pensé que agregaría otra forma de hacerlo.

Puede aprovechar el hecho de que la propiedad de texto se puede establecer usando "Run s", por lo que puede configurar enlaces múltiples usando una ejecución para cada uno. Esto es útil si usted no tiene acceso a MultiBinding (que no he encontrado en el desarrollo para Windows Phone)

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

Este es un enfoque muy útil para usar cuando se vincula a varias cadenas que se obtienen como DynamicResource como se puede No use un MultiBinding con StringFormat para eso. – slugster

+6

Solo funciona con .NET 4.0+ – Doug

+0

Acabo de probar esto. Funciona, sin embargo, cada elemento (incluso la geometría) que se dibuja (en una actualización) ahora parpadea cada tic por alguna razón. Voy a probar el otro método. –

Cuestiones relacionadas