This article has been localized into Spanish by the community.
La propiedad StringFormat
Como vimos en los capítulos anteriores, la forma de manipular la salida de un enlace antes de mostrarlo normalmente es a través de un convertidor. Lo bueno de los convertidores es que te permiten convertir cualquier tipo de dato en otro completamente diferente. Sin embargo, para escenarios de uso más simples, donde solamente quieres cambiar la forma en que se muestra cierto valor y no necesariamente convertirlo en un tipo diferente, la propiedad StringFormat podría ser suficiente.
Usando la propiedad StringFormat de un enlace (bindeo), se puede perder algo de flexibilidad en comparación de un convertidor (converter), pero a cambio, es más fácil usarlo y no implica la creación de una nueva clase en un nuevo archivo
La propiedad StringFormat (Formato de cadena) hace exactamente lo que implica el nombre: dar formato a la salida de la cadena, simplemente llamando al metodo StringFormat. A veces un ejemplo vale más que mil palabras, así que antes de que alcance ese número de palabras, veamos un ejemplo:
<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="StringFormatSample" Height="150" Width="250"
Name="wnd">
<StackPanel Margin="10">
<TextBlock Text="{Binding ElementName=wnd, Path=ActualWidth, StringFormat=Window width: {0:#,#.0}}" />
<TextBlock Text="{Binding ElementName=wnd, Path=ActualHeight, StringFormat=Window height: {0:C}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Date: {0:dddd, MMMM dd}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, StringFormat=Time: {0:HH:mm}}" />
</StackPanel>
</Window>
La primera pareja de valores del TextBlock fueron obtenidos del enlace (bindeo) a la ventana padre y estos son el ancho y alto (propedades de la ventana Width, Height respectivamente). Mediante la propiedad StringFormat, se le brindó formato a los valores. Para el Width y Height especificamos un formato perzonalizado. Usamos el formato de moneda solo por diversión. El valor está registrado como un tipo double, entonces podemos usar las mismas especificaciones como si hubieramos llamado el metodo double.ToString(). Puedes encontrar una lista aquí: http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Fíjate también como puedo incluir texto personal en el StringFormat - esto te permite pre/post ajustar el valor enlazado con texto a tu gusto. Cuando hace referencia al valor real dentro de la cadena de formato,el formato lo tenemos que rodear con un conjunto de llaves, que incluye dos valores: una referencia al valor que queremos formatear (valor 0, es el primer valor posible) y la cadena de formato, separados por dos puntos.
Para los dos últimos valores, simplemente enlazamos la fecha actual (DateTime.Now) y la salida, el primer valor como una fecha, en un formato especifico, y luego como tiempo (horas y minutos), otra vez usando nuestro propio formato predefinido. Puedes leer más sobre el formateo del DataTime aquí: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx
Formateando sin texto extra
Ten en cuenta que si especificas un formato de cadena que no incluye ningún texto personalizado, como la tenía todos los ejemplos anteriores, entonces necesitas añadir una llaves extras cuando lo defines en el XAML. La razón es que WPF puede confundir la sintaxis con la usada por "Markup Extensions". Aquí tienes un ejemplo:
<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="StringFormatSample" Height="150" Width="250"
Name="wnd">
<WrapPanel Margin="10">
<TextBlock Text="Width: " />
<TextBlock Text="{Binding ElementName=wnd, Path=ActualWidth, StringFormat={}{0:#,#.0}}" />
</WrapPanel>
</Window>
Usar una cultura específica
Si tu necesitas mostrar un valor enlazado acorde con una cultura específica, no hay problema. El enlazado usará el idioma especificado por el elemento padre, o tu puedes especificarlo directamente desde el enlace, usando la propiedad ConverterCulture. Aquí tienes un ejemplo:
<Window x:Class="WpfTutorialSamples.DataBinding.StringFormatCultureSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib"
Title="StringFormatCultureSample" Height="120" Width="300">
<StackPanel Margin="10">
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='de-DE', StringFormat=German date: {0:D}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='en-US', StringFormat=American date: {0:D}}" />
<TextBlock Text="{Binding Source={x:Static system:DateTime.Now}, ConverterCulture='ja-JP', StringFormat=Japanese date: {0:D}}" />
</StackPanel>
</Window>
Esto es muy fácil: Combinando la propiedad StringFormat, que usa el especificador D (patron de fecha larga) y la propiedad ConverterCulture, podemos mostrar el valor enlazado acorde con una especifica cultura. Bastante ingenioso