2009-02-12 20 views
67

Quiero mostrar una lista de objetos del Cliente en un WPF ItemsControl. He creado un DataTemplate para esto:Concatenar cadenas en lugar de usar una pila de TextBlocks

<DataTemplate DataType="{x:Type myNameSpace:Customer}"> 
     <StackPanel Orientation="Horizontal" Margin="10"> 
      <CheckBox"></CheckBox> 
      <TextBlock Text="{Binding Path=Number}"></TextBlock> 
      <TextBlock Text=" - "></TextBlock> 
      <TextBlock Text="{Binding Path=Name}"></TextBlock> 
     </StackPanel> 
    </DataTemplate> 

Así que lo que quiero es básicamente una lista simple (con casillas de verificación) que contiene el número - NOMBRE. ¿No hay una manera en que pueda concaturar el número y el nombre directamente en la parte vinculante?

Respuesta

140

Existe la propiedad StringFormat (en .NET 3.5 SP1), que probablemente pueda usar. Y útil WPF binding cheat sheat puede encontrar here. Si no ayuda, siempre puede escribir su propio ValueConverter o propiedad personalizada para su objeto.

Acabo de marcar, puede utilizar StringFormat con multiburación. En su caso código será algo como esto:

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

tuve que empezar cadena de formato con el espacio, de lo contrario Visual Studio no construiría, pero creo que se encontrará manera conseguir alrededor de él :)

Editar
Se necesita espacio en StringFormat para evitar que el analizador trate {0} como un enlace real. Otras alternativas:

<!-- use a space before the first format --> 
<MultiBinding StringFormat=" {0} - {1}"> 

<!-- escape the formats --> 
<MultiBinding StringFormat="\{0\} - \{1\}"> 

<!-- use {} before the first format --> 
<MultiBinding StringFormat="{}{0} - {1}"> 
+24

En lugar del espacio, puede usar {}, p. StringFormat = "{} {0} - {1}" –

+0

¡Gracias, no lo sabía! :) – PiRX

+0

Esto es algo útil, ¡gracias por todo! –

3

También puede usar una ejecución enlazable. Cosas útiles, especialmente si uno quiere agregar algún formato de texto (colores, fontweight, etc.).

<TextBlock> 
    <something:BindableRun BoundText="{Binding Number}"/> 
    <Run Text=" - "/> 
    <something:BindableRun BoundText="{Binding Name}"/> 
</TextBlock> 

Here's una clase original:
Here son algunas mejoras adicionales.
Y eso es todo en una sola pieza de código:

public class BindableRun : Run 
    { 
     public static readonly DependencyProperty BoundTextProperty = DependencyProperty.Register("BoundText", typeof(string), typeof(BindableRun), new PropertyMetadata(new PropertyChangedCallback(BindableRun.onBoundTextChanged))); 

     private static void onBoundTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      ((Run)d).Text = (string)e.NewValue; 
     } 

     public String BoundText 
     { 
      get { return (string)GetValue(BoundTextProperty); } 
      set { SetValue(BoundTextProperty, value); } 
     } 

     public BindableRun() 
      : base() 
     { 
      Binding b = new Binding("DataContext"); 
      b.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(FrameworkElement), 1); 
      this.SetBinding(DataContextProperty, b); 
     } 
    } 
36

En caso de que quiera concat un valor dinámico con un texto estático, intente esto:

<TextBlock Text="{Binding IndividualSSN, StringFormat= '\{0\} (SSN)'}"/> 

Muestra: 234-334- 5566 (SSN)

+1

¿Cuál es el contenido de TextBlockLeftStyle? – itsho

+0

Es un estilo personalizado que tengo que alinear el bloque de texto a la izquierda. No tiene importancia aquí. – redskull

7

Véase el siguiente ejemplo que utilicé en mi código usando la clase de ejecución:

 <TextBlock x:Name="..." Width="..." Height="..." 
      <Run Text="Area="/> 
      <Run Text="{Binding ...}"/> 
      <Run Text="sq.mm"/> 
      <LineBreak/> 
      <Run Text="Min Diameter="/> 
      <Run Text="{Binding...}"/> 
      <LineBreak/> 
      <Run Text="Max Diameter="/> 
      <Run Text="{Binding...}"/> 
     </TextBlock > 
Cuestiones relacionadas