TOC

This article has been localized into Czech by the community.

Datové vazby (Data binding):

Převod hodnot pomocí IValueConverter

Doposud jsme používali některé jednoduché datové vazby (data binding), kde vysílací a přijímací vlastnost byly vždy kompatibilní. Brzy se však setkáte se situacemi, kdy budete chtít použít vázanou hodnotu jednoho typu a poté ji prezentovat trochu jinak.

Kdy použít hodnotový konvertor

Hodnotové konvertory jsou velmi často používány s datovými vazbami. Zde jsou některé základní příklady:

  • Máte numerickou hodnotu, ale chcete zobrazovat nulové hodnoty jedním způsobem a kladné čísla jiným způsobem.
  • Chcete zkontrolovat zaškrtnutí zaškrtávacího políčka na základě hodnoty, ale hodnota je řetězec jako "ano" nebo "ne" místo hodnoty typu Boolean.
  • Máte velikost souboru v bajtech, ale chcete ji zobrazit jako bajty, kilobajty, megabajty nebo gigabajty podle toho, jak velká je.

Toto jsou nejznámější nejjednodušší případy, ale je jich mnohem více. Například můžete chtít zaškrtnout zaškrtávací políčko na základě hodnoty typu Boolean, ale chcete, aby bylo opačně, aby bylo zaškrtnuto, když je hodnota false a nezaškrtnuto, když je hodnota true. Dokonce můžete použít konvertor k vytvoření obrázku pro ImageSource na základě hodnoty, jako je zelená značka pro true nebo červená značka pro false - možnosti jsou prakticky nekonečné!

Pro případy jako tyto můžete použít konvertor hodnot. Tyto malé třídy, které implementují rozhraní IValueConverter, budou fungovat jako prostředníci a přeloží hodnotu mezi zdrojem a cílem. Takže v každé situaci, kdy potřebujete transformovat hodnotu, než dosáhne svého cíle, nebo zpět k jejímu zdroji, pravděpodobně budete potřebovat konvertor.

Implementace jednoduchého konvertoru hodnot

Jak bylo zmíněno, převodník hodnot WPF musí implementovat rozhraní IValueConverter, případně alternativně rozhraní IMultiValueConverter (více o tomto později). Obě rozhraní vyžadují implementaci pouze dvou metod: Convert() a ConvertBack(). Jak název napovídá, tyto metody budou použity pro převod hodnoty do cílového formátu a pak zpět.

Implementujme jednoduchý převodník, který bere jako vstup řetězec a poté vrací hodnotu boolean, stejně tak i naopak. Pokud jste nováčkem ve WPF, a to pravděpodobně jste, pokud čtete tento tutoriál, pak možná nebudete znát všechny koncepty použité v příkladu, ale nebojte se, vše bude vysvětleno po ukázkách kódu.

<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

Takže začneme odzadu a postupně se propracujeme příkladem. Implementovali jsme převodník v souboru Code-behind s názvem YesNoToBooleanConverter. Jak již název napovídá, implementuje pouze dvě požadované metody, které se nazývají Convert() a ConvertBack(). Metoda Convert() předpokládá, že jako vstup dostane řetězec (parametr value) a poté ho převede na boolean true nebo false, s výchozí hodnotou false. Pro zábavu jsem přidal také možnost provést tuto konverzi z francouzských slov.

Metoda ConvertBack() samozřejmě dělá opak: Předpokládá vstupní hodnotu typu boolean a poté vrací anglické slovo "yes" nebo "no", s výchozí hodnotou "no".

Můžete se divit nad dalšími parametry, které tyto dvě metody přijímají, ale v tomto příkladu nejsou potřebné. Použijeme je v jedné z příštích kapitol, kde budou vysvětleny.

XAML

V části XAML programu začínáme deklarací instance našeho převodníku jako zdroje pro okno. Poté máme TextBox, pár TextBlocků a ovládací prvek CheckBox a zde se dějí zajímavé věci: Hodnotu TextBoxu vážeme na TextBlock a ovládací prvek CheckBox a pomocí vlastnosti Converter a naší vlastní reference na převodník přehazujeme hodnoty tam a zpět mezi řetězcem a Booleovou hodnotou, v závislosti na tom, co je potřeba.

Pokud tento příklad spustíte, budete moci hodnotu změnit na dvou místech: Napsáním "yes" do TextBoxu (nebo jakékoli jiné hodnoty, pokud chcete false) nebo zaškrtnutím CheckBoxu. Ať už uděláte cokoli, změna bude odrážena i v druhém ovládacím prvku stejně jako v TextBlocku.

Shrnutí

Toto byl příklad jednoduchého konvertoru hodnot, který byl pro ilustrační účely trochu prodloužen. V další kapitole se podíváme na pokročilejší příklad, ale než vyrazíte psát vlastní konvertor, může být dobré zkontrolovat, zda WPF již pro tento účel nějaký neobsahuje. V době psaní existuje více než 20 vestavěných konvertorů, které můžete využít, ale musíte znát jejich název. Našel jsem následující seznam, který by vám mohl přijít vhod: 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!