TOC

This article has been localized into Portuguese by the community.

Data binding:

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!


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!