number .net wpf binding formatting text-formatting

.net - number - ¿Cuál es el equivalente de WPF XAML Data Binding de String.Format?



wpf binding format number (5)

O, para ser más claros, ¿cómo puedo formatear un bloque de texto (en mi caso, para incluirlo en una información sobre herramientas) de manera que algunas partes del texto provengan de valores encuadernados?

En C simple usaría:

_toolTip.Text = string.Format("{1:#0}% up, {2:#0}% down", Environment.NewLine, percentageOne, percentage2);

Sin embargo, el marcado WPF XAML para una propiedad de texto parece capaz de contener solo un enlace único. Las llaves me dieron muchas esperanzas, pero esto no es posible:

<Element> <Element.Tooltip> <!-- This won''t compile --> <TextBlock Text="{Binding Path=PercentageOne}% up, {Binding Path=PercentageTwo}% down"/> </Element.Tooltip> </Element>

Leí que la propiedad Run.Text no es una propiedad de dependencia y, por lo tanto, no se puede vincular.

¿Hay alguna forma de que pueda realizar este formateo en XAML?



La forma en que he resuelto esto en el pasado es en realidad dividir el TextBlock que tienes en tu lista en varios TextBlocks. Pruebe algo como esto:

<Element> <Element.Tooltip> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Path=PercentageOne}"/> <TextBlock Text="% up, "/> <TextBlock Text="{Binding Path=PercentageTwo}"/> <TextBlock Text="% down"/> </StackPanel> </Element.Tooltip> </Element>

Alternativamente, puede crear algo así como un StringFormatConverter, que podría tomar la cadena de formato como parámetro, y usar un MultiBinding para pasarle los parámetros. Vea este enlace para MultiBindings:

Información de enlaces múltiples

Y este para obtener información sobre los convertidores:

Información de convertidores

Puede imaginar fácilmente un convertidor que toma "valores de objeto []" en lugar de "valor de objeto" como su primer parámetro, y los pasa a la función de Formato.


Por lo que sé, WPF no hace lo que quieres. Tienes una solución mucho más poderosa (aunque más complicada).

Eche un vistazo a la interfaz IValueConverter .

MSDN HowTo enlace aquí

EDITAR

En base a la respuesta de aku, y su afirmación de que no puede usar 3.5 SP1, aquí hay una alternativa.

Eche un vistazo a la reciente serie de publicaciones de Phil Haack sobre el formato de cadenas:

Crea un ValueConverter, ya que toma el formato como una propiedad. Debería poder vincular su objeto de datos y hacer que se formatee según su formato definido (utilizando el nombre de la propiedad en lugar de la posición).


Me dividiría en varios bloques de texto, vinculando cada uno con StringFormat = {0: P} en el enlace como tal:

<TextBox Text="{Binding Something, StringFormat=/{0:P/}}" />

Vea esta publicación para ver ejemplos: Lester''s WPF Blog on StringFormat

Pago VS2010: el enlace de las propiedades incluye el formato en las opciones.


Si está utilizando 3.5 SP1, la respuesta de Aku es el camino a seguir. Si no lo está, puede usar FormatConverter desde mi biblioteca de Conversor WPF .