2009-09-15 8 views
7

Tengo el siguiente código para mostrar la edad de un cliente.WPF Mezcla de texto enlazado y fijo en un cuadro de texto

<TextBox x:Name="txtClientAge" Text="{Binding Path=ClientAge}" /> 

Sin embargo, en lugar de simplemente mostrar sólo el número, quiero el prefijo con el texto "Edad" y el sufijo con el texto "años" por lo que se convierte efectivamente en "Edad 36 años"

Puedo lograr esto con un StackPanel horizontal y 3 Textboxes, pero ¿hay un método mucho más simple que me falta?

+0

¿Desea que las partes "edad" y "años" sean editables? Es decir. ¿debería el usuario escribir "años 40 años" (o quizás también simplemente "40") en el cuadro de texto en su totalidad, y hacer que se analice correctamente? –

+0

En cualquier caso, si solo tiene un cuadro de texto único en su aplicación (es decir, no es necesario que sea reutilizable), la solución StackPanel + 2 TextBlocks + TextBox será la más simple. –

+0

Solo se debe utilizar como de solo lectura, no es necesario realizar ninguna actualización. – Mitch

Respuesta

8

Suponiendo que no necesita el valor de edad para ser editable, en WPF 4.0 la propiedad Text de Run será enlazable, esto probablemente no lo ayude ahora a menos que esté utilizando el prelanzamiento, pero estará capaz de hacer algo como lo siguiente:

<TextBlock x:Name="txtClientAge" > 
    <Run Text="Age "/><Run Text="{Binding Path=ClientAge}"/><Run Text=" Yrs"/> 
</TextBlock> 

ACTUALIZACIÓN Heres otra alternativa para la solución de cadena de formato que funciona, pero no es especialmente bonita (de hecho es bastante hacky). Utiliza el siguiente convertidor en la unión (propiedad de clientela suponiendo que es de tipo int):

public class AgeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
          System.Globalization.CultureInfo culture) 
    { 
     string age = value.ToString(); 
     return "Age " + age + " years"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
           System.Globalization.CultureInfo culture) 
    { 
     string age = value as string; 
     return Int32.Parse(age.Replace("Age ", " ").Replace(" years", "")); 
    } 
} 
+0

Gracias Simón, ese era el tipo de cosa que estaba buscando, pero como dices, ¡aún no está con nosotros! Podría tener que adoptar un enfoque largo por ahora hasta que WPF 4.0 esté con nosotros. – Mitch

+0

Bonito poco de compañero de pensamiento lateral. Actualmente estoy disfrutando el uso de Convertidores para todo tipo de cosas, por lo que su enfoque realmente atrae. ¡Gracias por eso! – Mitch

+0

Sí, el ConvertBack es la parte que no me gusta, pero dado que es una situación de solo lectura que no va a ser un problema. –

5

Puede crear una propiedad en la clase que está vinculando también que crea la cadena de texto que desea mostrar.

También hay la ruta StringFormat:

<textblock text="{Binding Path=mydate, StringFormat=d}"/> 

Puede cortar las constantes en la cadena de formato.

Prefiero el método de propiedad.

+3

Esto básicamente está modificando su modelo para que sea visible, una muy mala idea desde el punto de vista del diseño. –

+1

+1 para StringFormat. De acuerdo con @Pavel: no cree una propiedad con este texto. – Andy

+2

Si realmente quiere hacer esto bien, entonces el texto tampoco pertenece a la vista. Debe estar en un área de recursos seleccionada por la capa de presentación en función de su configuración cultural actual. Por eso, todas mis cosas provienen de las propiedades del presentador. – Jay

5

Esto es muy una vieja pregunta, pero creo que esta es la mejor solución actual (si desea editar el texto).

Puede hacerlo con un InlineUIContainer en un TextBlock con un Textbox anidado.

Nota: He usado BaselineAlignment="Center" para alinear los componentes. También puede agregar márgenes positivos o negativos al TextBox según sea necesario. También configuro el borde del TextBox como transparente para que se vea como parte del TextBlock, aunque es editable y seleccionable.

<TextBlock Foreground="SteelBlue"> 
    <Run Text="Package Barcode:" FontWeight="Bold" BaselineAlignment="Center"/> 
    <InlineUIContainer BaselineAlignment="Center"> 
     <TextBox Margin="2,0,0,0" Foreground="Gray" Text="{Binding BarcodeNumber}" BorderThickness="0" Padding="0"/> 
    </InlineUIContainer> 
</TextBlock> 
+1

sí, me doy cuenta de que el cuestionario original en última instancia quería que la 'edad' fuera solo de lectura, pero esta es la respuesta a la pregunta :-) –

1

Esto es como una respuesta anterior - (pero son todos con Texblocks ... así que aquí una versión del cuadro de texto), también quería mostrar el enfoque de unión múltiple. Para obtener una TexBox a hacer lo que quiera, puede utilizar el siguiente código:

<TextBox> 
<TextBox.Text> 
    <MultiBinding StringFormat="Age {0} yrs and {1} months"> 
    <Binding Path="Years" /> 
    <Binding Path="Months" /> 
    </MultiBinding> 
</TextBox.Text> 
</TextBox> 

puede ser útil si usted desea hacer su texto seleccionable por lo que un usuario puede copiar el código.

Cuestiones relacionadas