TOC

This article has been localized into Turkish by the community.

Veri bağlama (data binding):

IValueConverter ile Değer Dönüştürme

Şimdiye kadar gönderdiğimiz ve aldığımız özelliklerin uyumlu veriler olduğu basit veri bağlamaları yaptık. Bununla beraber bazen bağlandığınız verinin bir tipte ama gösterdiğinizin başka tipte olduğu durumlarla karşılaşabilirsiniz.

Değer dönüştürme ne zaman kullanılır

Değer dönüştürücüler veri bağlamada çok sıklıkla kullanılır. Burada bazı örnekler var :

  • Sayısal bir değeriniz var ama sıfır değeri başka türlü ve pozitif sayıları başka türlü göstermek istiyorsunuz
  • Bir CheckBox'ı boolean değer yerine "yes" veya "no" gibi string değere göre check etmek istiyorsunuz
  • Dosya boyutunuz byte olarak değere sahip ama siz büyüklüğe göre byte, kilobyte, megabyte, gigabyte olarak göstermek istiyorsunuz

Bunlar basit birkaç olasılık, fakat daha birçok var. Mesela CheckBox değerini boolean ama tersine olarak false ise seçili olmasını isteyebilirsiniz. True değere karşı yeşil ışık resmi false değere karşı kırmızı ışık resmi göstermek gibi.. Olasılıklar sonsuz!

Bu gibi durumlarda değer dönüştürme kullanabilirsiniz. IValueConverter interface uygulayan küçük sınıf tanımları kaynak ve hedef arasında veriyi birinden diğerinin anlayacağı şekle tercüme eden bir aracı kişi olarak düşünebilirsiniz. Bu durumda değer kaynaktan hedefe giderken ya da tersine kaynağa giderken bir dönüştürücüye ihtiyacınız vardır.

Basit bir veri dönüştürücüyü uygulamak

Bahsedildiği gibi WPF'de veri dönüştürmek IValueConverter interface uygulaması gerektirir, ya da alternatif olarak IMultiValueConverter interface uygulamak (bunu hakkında bilgi daha sonra). Her iki interface de Convert() ve ConvertBack() adında iki metod tanımlamanıza ihtiyaç duyar. Adlarından da anlaşılacağı üzere bu metodlar değeri hedef özellik formatına dönüştürmeye ya da tersine dönüştürmeye yarar.

Hadi bir string değeri giriş olarak alan ve onu boolean değere dönüştüren bir dönüştürücü ve geri dönüştürücü uygulayalım. Eğer WPF'de yeniyseniz ve bu öğreticiyi okuyorsanız bu örnekte kullanılan tüm konseptleri anlamayabilirsiniz, ama merak etmeyin hepsi kodun gösterilmesi ardından açıklanacaktır :

<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";
		}
	}
}

Arkaplan Kodu

O zaman önce arkadan başlayalım ve örnek boyunca ilerleyelim. Arkaplan kodunda adı YesNoToBooleanConverter bir sınıf tanımını IValueConverter interface'inden türeterek yaptık. Bilindiği gibi interface bizi bazı metod veya özellik tanımlarına zorlayan kalıp yapı. Bu da bizi Convert() ve ConvertBack() adında iki metod tanımlamaya mecbur eder. Convert() metodu girişte bir string aldığını kabul eder (value parametresi) ve sonra onu Boolean true ya da false değere dönüştürür, emniyet değeri false'dur. Ayrıca eğlence için buraya Fransızca kelimelerden dönüşüm de ekledim.

ConvertBack() metodu, açıktır ki bunun tersini yapacak : girişinde bir Boolean değer olduğunu varsayarak İngilizce kelimeler "yes" ya da "no" dönecek, emniyet değeri de "no".

Bu metodların aldığı bir sürü diğer parametreleri merak edebilirsiniz, fakat onlar bu örnekte gereksiz. Sonraki bölümlerde bu parametreleri kullanacağız ve orada açıklayacağız.

XAML Kodu

Programın XAML parçasında pencereye yazdığımız dönüştürücüyü bir kaynak olarak tanımlamayla başlıyoruz. Sonra bir TextBox, bir çift TextBlock ve bir CheckBox kontrolü var ve burada ilginç şeyler oluyor : TextBox'tan TextBlock ve CheckBox kontrollerine Converter özelliğinde bizim referansımızı vererek birer veri bağlaması yaptık. Böylece değerler string ve boolean değerler arasında ihtiyaca göre dönüşüp duruyor.

Bu örneği çalıştırırsanız değeri iki şekilde değiştirebilirsiniz : TextBox içinde "yes" yazarak (ya da false değer için herhangi başka bir şey yazarak) veya CheckBox'ı tıklayarak. Hangisini değiştirirseniz diğeri değişir ve TextBlock içeriği değişir.

Sonuç

Bu basit bir veri dönüştürücü örneğiydi, gösterim amacıyla biraz uzun sürdü. İyi anlamak için kaynak neresi , hedef neresi dikkat ediniz. Sonraki bölümde daha gelişmiş bir örnek inceleyeceğiz, fakat gidip kendi dönüştürücünüzü yazmadan önce belki WPF'nin amacınıza uygun hazır bir dönüştürücüsü var mı kontrol edin. Çünkü bu yazı yazılırken 20'den fazla tanımlanmış dönüştürücü vardı, sadece isimlerini bilmeniz gerekiyor. Size yardımı olabilecek bir listeyi şu adreste buldum : 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!