TOC

This article has been localized into Portuguese by the community.

Data binding:

Conversão de valores com IValueConverter

Até agora, usamos algumas ligações de dados simples, nas quais a propriedade de envio e recebimento era sempre compatível. No entanto, você logo se deparará com situações em que deseja usar um valor vinculado de um tipo e apresentá-lo de maneira ligeiramente diferente.

Quando usar um conversor de valor

Conversores de valor são usados com muita frequência com ligações de dados. Aqui estão alguns exemplos básicos:

  • Você tem um valor numérico, mas deseja mostrar valores zero de uma forma e números positivos de outra maneira
  • Você deseja verificar um CheckBox com base em um valor, mas o valor é uma string como "yes" ou "no" em vez de um valor booleano
  • Você tem um tamanho de arquivo em bytes, mas deseja exibi-lo como bytes, kilobytes, megabytes ou gigabytes com base no tamanho

Estes são alguns dos casos simples, mas existem muitos mais. Por exemplo, você pode querer marcar uma caixa de seleção com base em um valor booleano, mas você quer que ela seja invertida, para que a CheckBox seja verificada se o valor for falso e não verificado se o valor for verdadeiro. Você pode até usar um conversor para gerar uma imagem para um ImageSource, com base no valor, como um sinal verde para true ou um sinal vermelho para false - as possibilidades são praticamente infinitas!

Para casos como esse, você pode usar um conversor de valor. Essas pequenas classes, que implementam a interface IValueConverter, agem como intermediários e traduzem um valor entre a origem e o destino. Portanto, em qualquer situação em que você precise transformar um valor antes de chegar ao seu destino ou voltar à sua origem novamente, provavelmente precisará de um conversor.

Implementando um conversor de valor simples

Como mencionado, um conversor de valor do WPF precisa implementar a interface IValueConverter ou, como alternativa, a interface IMultiValueConverter (mais sobre isso posteriormente). Ambas as interfaces requerem apenas que você implemente dois métodos: Convert() e ConvertBack(). Como o nome indica, esses métodos serão usados para converter o valor para o formato de destino e, em seguida, novamente.

Vamos implementar um conversor simples que use uma string como entrada e, em seguida, retorne um valor booleano, assim como o contrário. Se você é novo no WPF e provavelmente já está lendo este tutorial, talvez não conheça todos os conceitos usados no exemplo, mas não se preocupe, eles serão explicados depois das listagens de código:

<Window x:Class="WpfTutorialSamples.DataBinding.ConverterSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
		xmlns:local="clr-namespace:WpfTutorialSamples.DataBinding"
        Title="ConverterSample" Height="140" Width="250">
	<Window.Resources>
		<local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" />
	</Window.Resources>
	<StackPanel Margin="10">
		<TextBox Name="txtValue" />
		<WrapPanel Margin="0,10">
			<TextBlock Text="Current value is: " />
			<TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock>
		</WrapPanel>
		<CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" />
	</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Data;

namespace WpfTutorialSamples.DataBinding
{
	public partial class ConverterSample : Window
	{
		public ConverterSample()
		{
			InitializeComponent();
		}
	}

	public class YesNoToBooleanConverter : IValueConverter
	{
		public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
		{
			switch(value.ToString().ToLower())
			{
				case "yes":
				case "oui":
					return true;
				case "no":
				case "non":
					return false;
			}
			return false;
		}

		public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
		{
			if(value is bool)
			{
				if((bool)value == true)
					return "yes";
				else
					return "no";
			}
			return "no";
		}
	}
}

Code-behind

Então, vamos começar pela parte de trás e depois trabalhar o nosso caminho através do exemplo. Nós implementamos um conversor no arquivo Code-behind chamado YesNoToBooleanConverter. Como anunciado, apenas implementa os dois métodos requeridos, chamados Convert() e ConvertBack(). Os métodos Convert() assumem que ele recebe uma string como entrada (o parâmetro valor ) e, em seguida, o converte em um valor booleano true ou false, com um valor de fallback false. Por diversão, acrescentei a possibilidade de fazer essa conversão de palavras em francês também.

O método ConvertBack() obviamente faz o oposto: Ele assume um valor de entrada com um tipo booleano e retorna a palavra em inglês "yes" ou "no" em return, com um valor de fallback de "não"....

Você pode se perguntar sobre os parâmetros adicionais que esses dois métodos executam, mas eles não são necessários neste exemplo. Vamos usá-los em um dos próximos capítulos, onde serão explicados.

XAML

Na parte XAML do programa, começamos declarando uma instância do nosso conversor como um recurso para a janela. Em seguida, temos um TextBox, um par de TextBlocks e um controle CheckBox e é aí que as coisas interessantes estão acontecendo: Nós ligamos o valor do TextBox ao TextBlock e ao controle CheckBox e usando a propriedade Converter e nossa própria referência de conversor, nós manipular os valores entre uma string e um valor booleano, dependendo do que for necessário.

Se você tentar executar este exemplo, poderá alterar o valor em dois locais: Escrevendo "sim" no TextBox (ou qualquer outro valor, se desejar false) ou marcando o CheckBox. Não importa o que você faça, a alteração será refletida no outro controle, assim como no TextBlock.

Resumo

Este foi um exemplo de um conversor de valor simples, feito um pouco mais do que o necessário para fins ilustrativos. No próximo capítulo, vamos dar uma olhada em um exemplo mais avançado, mas antes de sair e escrever seu próprio conversor, você pode querer verificar se o WPF já inclui um para o propósito. Como de escrever, existem mais de 20 conversores embutidos que você pode aproveitar, mas você precisa saber o nome deles. Eu encontrei a seguinte lista que pode ser útil para você: http://stackoverflow.com/questions/505397 / built-in-wpf-ivalueconverters

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!