This article has been localized into Danish by the community.
Værdikonvertering med IValueConverter
Indtil videre har vi brugt simple databindinger, hvor afsender- og modtageregenskaberne altid var kompatible. Men du vil komme til situationer, hvor du ønsker at binde en værdi af en type og præsentere den lidt anderledes.
Hvor bruges en værdikonvertering
Værdikonverteringer bruges jævnligt med databinding. Her er nogle elementære eksempler:
- Du har en numerisk værdi, men ønsker at vise nul-værdi på en måde og positive tal på en anden måde
- Du ønsker at afkrydse en Checkbox baseret på en værdi, men værdien er en streng som "ja" eller "nej" i stedet for en Boolean værdi
- Du har en filstørrelse i bytes, men ønsker at vise den som bytes, kilobytes, megabytes eller gigabytes baseret på størrelsen af den
Dette er nogle af de simple tilfælde, men der er mange flere. F.eks. kunne du ønske at markere et afkrydsningsfelt baseret på en Boolean værdi, men du ønsker den omvendt, så CheckBox kontrollen er markeret, hvis værdien er falsk og ikke markeret, hvis værdien er sand. Du kan endda bruge en konvertering til at generere et billede til en ImageSource, baseret på værdien, som et grønt signal for sand og rødt signal for falsk. Mulighederne er praktisk talt endeløse!
I disse tilfælde bruger du en værdikonvertering. Disse små klasser, som implementerer IValueConverter interfacet, optræder som mellemmænd og oversætter en værdi mellem kilden og destinationen. Så i alle tilfælde, hvor du har brug for at transformere en værdi før den når destinationen eller tilbage til dens kilde igen, har du højst sandsynligt brug for en konvertering.
Implementering af en simpel værdikonvertering
Som nævnt skal en WPF værdikonvertering implementere IValueConverter interfaces, eller alternative IMultiValueConverter interfacet (mere om den senere). Begge interfaces kræver implementering af to metoder: Convert() og ConvertBack(). Som navnene antyder, bruges disse metoder til at konvertere værdin til destinationsformatet og tilbage igen.
Lad os implementere en simpel konvertering, som tager en streng som input og returnerer en Boolean, samt den anden vej rundt. Hvis du er ny i WPF - hvad du sikkert er, når du læser dette selvstudie - kender du måske ikke alle koncepterne, der bruges i eksemplet, men de vil blive forklaret efter kode-listningerne.
<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
Så, lad os starte bagfra og arbejde os gennem eksemplet. Vi har implementeret en konvertering i code-behind filen ved navn YesNoToBooleanConverter. Som lovet, implementerer den de to krævede metoder, Convert() og ConvertBack(). Convert() metoden antager, at det modtager en streng som input (value parameteren) og konverterer den til en Boolean sand eller falsk værdi -med en fallback værdi falsk. For sjov tilføjede jeg muligheden for at lave konverteringen fra fransk også.
ConvertBack() metoden gør naturligvis det modsatte: Den antager en inputværdi med en Boolean type og returnerer det engelske ord "yes" eller "no", med fallback værdi "no".
Du undrer dig måske over de ekstra parametre, disse to metoder har, men de er ikke nødvendige i dette eksempel. Vi vil bruge dem i et af de næste afsnit, hvor de vil blive forklaret.
XAML
I XAML-delen af programmet starter vi med at erklære en instans af vores konvertering som en ressource i vinduet. Vi har så en TextBox, nogle TextBlocks og en CheckBox kontrol, og det er her, det interessante sker: Vi binder værdien af TextBox til TextBlock kontrollen og til CheckBox kontrollen, og ved hjælp af Converter egenskaben og vores egen konverteringsreference jonglerer vi værdierne frem og tilbage mellem en streng og en Boolean værdi afhængig af hvad, der kræves.
Hvis du kører dette eksempel, vil du kunne ændre værdien to steder: Ved at skrive "yes" i TextBox kontrollen (eller enhver anden værdi, hvis du ønsker falsk), eller ved at markere CheckBox kontrollen. Uanset hvad, du gør, vil ændringen blive afspejlet i den anden kontrol og også i TextBlock kontrollen.
Resume
Dette var et eksempel på en simple værdikonvertering - gjort en smule længere end nødvendigt for illustrationens skyld. I det næste afsnit vil vi se på et mere avanceret eksempel, men før du begynder at skrive dine egne konverteringer, bør du tjekke, om WPF allerede har en til formålet. For øjeblikket er der mere end 20 indbyggede konverteringer, du kan have glæde af, men du er nødt til at kende deres navne. Jeg har fundet denne liste, som kan være nyttig: http://stackoverflow.com/questions/505397/built-in-wpf-ivalueconverters