This article has been localized into Portuguese by the community.
A propriedade StringFormat
Como vimos nos capítulos anteriores, a maneira de manipular a saída de uma ligação antes é mostrada normalmente através do uso de um conversor. O legal sobre os conversores é que eles permitem converter qualquer tipo de dados em um tipo de dados completamente diferente. No entanto, para cenários de uso mais simples, em que você deseja apenas alterar a maneira como um determinado valor é mostrado e não necessariamente convertê-lo em um tipo diferente, a propriedade StringFormat pode muito bem ser suficiente.
Usando a propriedade StringFormat de uma ligação, você perde parte da flexibilidade que obtém ao usar um conversor, mas, em contrapartida, é muito mais simples de usar e não envolve a criação de uma nova classe em um novo arquivo.
A propriedade StringFormat faz exatamente o que o nome sugere: Formata a cadeia de saída, simplesmente chamando o método String.Format. Às vezes, um exemplo diz mais que mil palavras, então antes de atingir a contagem de palavras, vamos pular direto para um exemplo:
<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>
Os primeiros dois TextBlock obtém seu valor vinculado a janela pai e obtendo sua largura e altura. Através da propriedade StringFormat, os valores são formatados. Para a largura, especificamos uma string de formatação personalizada e, para a altura, solicitamos que use o formato de moeda, apenas por diversão. O valor é salvo como um tipo double, portanto, podemos usar todos os mesmos especificadores de formato como se tivéssemos chamado double.ToString(). Você pode encontrar uma lista deles aqui: http://msdn.microsoft.com/en-us/library /dwhawy9k.aspx
Veja também como posso incluir texto personalizado no StringFormat - isso permite que você ajuste o valor vinculado antes e depois com o texto que você quiser. Ao referenciar o valor real dentro da string de formatação, nós o cercamos por um conjunto de chaves, que inclui dois valores: Uma referência ao valor que queremos formatar (valor número 0, que é o primeiro valor possível) e a string de formato , separados por dois pontos....
Para os dois últimos valores, simplesmente ligamos a data atual (DateTime.Now) e a saída é primeiro como uma data, em um formato específico e, em seguida, como a hora (horas e minutos), novamente usando nosso próprio formato pré-definido. Você pode ler mais sobre formatação de DateTime aqui: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx
Formatando sem texto extra
Por favor, esteja ciente de que se você especificar uma string de formato que não inclua nenhum texto personalizado, o que faz todos os exemplos acima, então você precisa adicionar um conjunto extra de chaves, ao defini-lo em XAML. O motivo é que o WPF pode confundir a sintaxe com a usada para extensões de marcação. Aqui está um exemplo:
<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>
Usando um Culture específico
Se você precisa produzir um valor vinculado de acordo com uma cultura específica, isso não é problema. A ligação usará o idioma especificado para o elemento pai ou você poderá especificá-lo diretamente para a ligação, usando a propriedade ConverterCulture. Aqui está um exemplo:
<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>
É muito simples: combinando a propriedade StringFormat, que usa o especificador D (Long date pattern) e a propriedade ConverterCulture, podemos produzir os valores vinculados de acordo com uma cultura específica. Muito bacana!