This article is currently in the process of being translated into Croatian (~99% done).
Value conversion with IValueConverter
Do sada smo koristili neka jednostavna povezivanja podataka, gdje su izvorišno i odredišno svojstvo uvijek bili kompatibilni. Međutim, uskoro ćete naići na situacije gdje želite povezati vrijednost jednog tipa i prikazati ga na drugačiji način.
Kada koristiti konverter vrijednosti
Konverteri vrijednosti se vrlo često koriste kod povezivanja podataka. Ovo su neki osnovni primjeri:
- Imate numeričku vrijednost, ali želite pokazati nulu na jedan način, a pozitivne brojeve na drugi
- Želite označiti CheckBox na temelju vrijednosti, ali je vrijednost tekst poput "da" ili "ne" umjesto Boolean vrijednosti
- Imate veličinu datoteke u bajtovima, ali želite ju prikazati u bajtovima, kilobajtima, megabajtima ili gigabajtima na temelju njene veličine
Ovo su neki od jednostavnih primjera, ali postoji ih još mnogo. Primjerice, želite označiti CheckBox na temelju Boolean vrijednosti, ali želite da bude obrnuto, tako da je CheckBox označen kada je vrijednost false, a nije označen kada je vrijednost true. Možete čak koristiti konverter da generirate sliku za neki ImageSource na temelju vrijednosti, primjerice zeleni znak za true ili crveni znak za false - mogućnosti su beskonačne!
Za ovakve slučajeve možete koristiti konverter vrijednosti. Ove male klase, koje implementiraju IValueConverter sučelje, će se ponašati poput posrednika i prevoditi vrijednost između izvora i odredišta. Tako da, u bilo kojoj situaciji u kojoj trebate pretvoriti vrijednost prije no što dođe do odredišta ili obrnuto, vjerojatno ćete trebati konverter.
Implementacija jednostavnog konvertera vrijednosti
Kao što je već spomenuto, WPF konverter vrijednosti mora implementirati IValueConverter sučelje, ili IMultiValueConverter sučelje (o ovome više kasnije). Ova sučelja zahtijevaju da implementirate samo dvije metode: Convert() i ConvertBack(). Kao što i imena govore, ove metode se koriste za konverziju vrijednosti u odredišni format i natrag.
Implementirajmo jednostavni konverter koji prima string kao ulaz i vraća Boolean vrijednost i obrnuto. Ako ste novi u WPF-u, a vjerojatno jeste jer čitate ovaj vodič, onda možda ne znate sve o konceptima koji se koriste u ovom primjeru, ali ne brinite, bit će objašnjeni nakon ispisa koda:
<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";
}
}
}
Pozadinski kod
Dakle, krenimo od pozadinskog dijela. Implementirali smo konverter u posebnoj datoteci i nazvali ga YesNoToBooleanConverter. Kao što je najavljeno, on samo implementira dvije potrebne metode, Convert() i ConvertBack(). Metoda Convert() pretpostavlja da prima string kao ulaz (parametar value) i zatim ga pretvara u Boolean vrijednost true ili false, s rezervnom vrijednošću false. Za zabavu, dodao sam mogućnost da se ova konverzija vrši i iz francuskih riječi.
Metoda ConvertBack() očito radi suprotno: pretpostavlja ulaznu vrijednost tipa Boolean i zatim vraća englesku riječ "yes" ili "no", s rezervnom vrijednošću "no".
Možda se pitate koje to dodatne parametre ove metode primaju, ali oni nisu potrebni u ovom primjeru. Koristit ćemo ih u jednom od idućih poglavlja i tamo će biti objašnjeni.
XAML
U XAML dijelu programa najprije deklariramo instancu našeg konvertera kao resurs za prozor. Onda imamo TextBox i nekoliko TextBlockova te CheckBox kontrolu i tu se događa ono zanimljivo: Vezujemo vrijednost TextBoxa za TextBlock i CheckBox kontrole i korištenjem Converter svojstva te naše vlastite konverter reference loptamo se sa string i Boolean vrijednostima, ovisno o tome što trebamo.
Ako pokušate pokrenuti ovaj primjer, moći ćete mijenjati vrijednost na 2 mjesta: Ili upisom vrijednosti "yes" u TextBox (ili bilo koje druge vrijednosti, ako želite false) ili označavanjem CheckBoxa. Bez obzira što napravite, promjena će se odraziti na drugu kontrolu kao i na TextBlock.
Sažetak
Ovo je bio primjer jednostavnog konvertera vrijednosti, koji je malo produžen radi ilustracije. U sljedećem poglavlju ćemo pogledati napredniji primjer, ali prije nego što krenete i napišete vlastiti konverter, možda biste željeli provjeriti uključuje li WPF već neki za tu svrhu. U trenutku pisanja ovog članka, postoji više od 20 ugrađenih konvertera koje možete iskoristiti, ali morate znati njihova imena. Pronašao sam sljedeći popis koji bi vam mogao biti koristan: http://stackoverflow.com/questions/505397/built-in-wpf-ivalueconverters"