2009-03-20 9 views
24

¿Cómo se lograría mezclar valores enlazados con texto constante en un control enlazado WPF?Enlazando solo parte de una etiqueta

Por ejemplo, supongamos que tengo un formulario que muestra pedidos, y quiero una etiqueta que muestre texto como "ID de pedido 1234".

cosas que he intentado como:

text="Order ID {Binding ....}" 

Es esto posible, o tengo que hacer algo como tener más de una etiqueta en un control de flujo?

Respuesta

23

Si está utilizando 3.5 SP1, puede utilizar la propiedad StringFormat sobre la unión:

<Label Content="{Binding Order.ID, StringFormat=Order ID \{0\}}"/> 

De lo contrario, utilizar un convertidor:

<local:StringFormatConverter x:Key="StringFormatter" StringFormat="Order ID {0}" /> 
<Label Content="{Binding Order.ID, Converter=StringFormatter}"/> 

Con StringFormatConverter ser un IValueConverter:

[ValueConversion(typeof(object), typeof(string))] 
public class StringFormatConverter : IValueConverter 
{ 
    public string StringFormat { get; set; } 

    public object Convert(object value, Type targetType, 
          object parameter, CultureInfo culture) { 
     if (string.IsNullOrEmpty(StringFormat)) return ""; 
     return string.Format(StringFormat, value); 
    } 


    public object ConvertBack(object value, Type targetType, 
           object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 

Eso hará el truco.

[Editar: Cambiar la propiedad Text a Content]

+1

Con el ejemplo de formato de cadena, ¿qué sucede si la cadena necesita contener una coma?¿Entonces no tiene más remedio que ir con la opción de conversión? –

+3

AFAIK el control de etiqueta no tiene la propiedad 'Text'. Debería enlazar a la propiedad 'Contenido' –

4

Otro enfoque es utilizar un solo TextBlock con múltiples elementos se ejecutan dentro de él:

<TextBlock><Run>Hello</Run><Run>World</Run></TextBlock> 

.. pero que se unen a un elemento necesitas usar agregar una clase BindableRun.

actualización Pero hay algunos inconvenientes de esta técnica ... ver here

+0

Esta es la opción si quiere también un formato diferente (número en negrita, por ejemplo) –

5

menudo pasado por alto es simplemente encadenar varios bloques de texto en conjunto, por ejemplo,

<TextBlock Text="{Binding FirstName}" /> 
<TextBlock Text=" " /> 
<TextBlock Text="{Binding LastName}" /> 
+0

Esto se mostrará en 3 líneas separadas. –

+3

esto depende de qué tipo de panel de distribución se encuentre en –

49

La propiedad Binding.StringFormat no funciona en Etiquetas, debe usar la propiedad ContentStringFormat en la Etiqueta.
Por ejemplo, el siguiente ejemplo servirá:

<Label Grid.Row="0" Name="TitleLabel"> 
    <Label.Content> 
     <Binding Path="QuestionnaireName"/> 
    </Label.Content> 
    <Label.ContentStringFormat> 
     Thank you for taking the {0} questionnaire 
    </Label.ContentStringFormat> 
</Label> 

Mientras que esta muestra no:

<Label Grid.Row="0" Name="TitleLabel"> 
     <Label.Content> 
      <Binding Path="QuestionnaireName" StringFormat="Thank you for taking the {0} questionnaire"/> 
     </Label.Content>    
    </Label> 
+0

suspiro. Otra restricción arbitraria impuesta por los desarrolladores de WPF. – glebd

+0

¿Alguna idea de por qué Binding.StringFormat no funciona? – Wouter

+2

Dado que 'Label.Content' es de tipo' Object', el enlace no ve la necesidad de convertir y formatear el valor como una cadena. – YotaXP

2

me encontré con otro enfoque. @ Solución de Inferis no funciona para mí y @ LPCRoy es no es elegante para mí:

<Label Content="{Binding Path=Order.ID, FallbackValue=Placeholder}" ContentStringFormat="Order ID {0}"> 

Es mi favorita en este momento, es flexible y parece condensada.

0

Modificado la respuesta de Mikolaj.

<Label Content="{Binding Order.ID}" ContentStringFormat="Order ID {0}" /> 

FallbackValue no es obligatorio.

Cuestiones relacionadas