TOC

This article has been localized into Turkish by the community.

Veri bağlama (data binding):

UpdateSourceTrigger Özelliği

Önceki yazımızda TextBox içeriğindeki değişimin hemen veri kaynağına yansımadığını ancak TextBox'tan çıkılıp fokusu kaybedince yansıdığını görmüştük. Veri bağlamada bu davranış UpdateSourceTrigger özelliğiyle kontrol edilir. Default değeri "Default" tur ve bu veri bağlaması yaptığınız özellik değer değişince kaynak da güncellenecek demektir. Ama şunu belirtelim Text özelliği dışındaki tüm özellikler değiştiği anda (PropertyChanged) güncelleme yapılır, Text özelliği ise eleman fokus kaybettiği anda güncellenir (LostFocus).

UpdateSourceTrigger özelliği default değeri Default böyle davranıyor. Diğer seçenekler ise PropertyChanged, LostFocus ve Explicit. İlk ikisinin nasıl güncelleme yaptığını az evvel açıkladık. sonuncusu ise Veri bağlamasında UpdateSource metodunun manual olarak çağrılması anlamına gelir.

Bütün bu seçeneklerin nasıl çalıştığını görmeniz için önceki bölümdeki örneği size tüm seçenekleri gösterecek şekilde değiştirdim :

<Window x:Class="WpfTutorialSamples.DataBinding.DataContextSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataContextSample" Height="130" Width="310">
	<StackPanel Margin="15">
		<WrapPanel>
			<TextBlock Text="Window title:  " />
			<TextBox Name="txtWindowTitle" Text="{Binding Title, UpdateSourceTrigger=Explicit}" Width="150" />
			<Button Name="btnUpdateSource" Click="btnUpdateSource_Click" Margin="5,0" Padding="5,0">*</Button>
		</WrapPanel>
		<WrapPanel Margin="0,10,0,0">
			<TextBlock Text="Window dimensions: " />
			<TextBox Text="{Binding Width, UpdateSourceTrigger=LostFocus}" Width="50" />
			<TextBlock Text=" x " />
			<TextBox Text="{Binding Height, UpdateSourceTrigger=PropertyChanged}" Width="50" />
		</WrapPanel>
	</StackPanel>
</Window>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace WpfTutorialSamples.DataBinding
{
	public partial class DataContextSample : Window
	{
		public DataContextSample()
		{
			InitializeComponent();
			this.DataContext = this;
		}

		private void btnUpdateSource_Click(object sender, RoutedEventArgs e)
		{
			BindingExpression binding = txtWindowTitle.GetBindingExpression(TextBox.TextProperty);
			binding.UpdateSource();
		}
	}
}

Gördüğünüz gibi, her TextBox şimdi ayrı UpdateSourceTrigger değerine sahip.

İlki Explicit yani siz manual olarak yapmadığınız müddetçe kaynak güncellenmeyecek (burada veri bağlamanın kaynağı kim, hedefi kim karıştırmamaya özen gösteriniz). Bu sebeple TextBox yanına bir Button ekledim, tıklanırsa kaynak güncellenecek. Arkaplan kodunda buton Click olayını işleyen metodu göreceksiniz, burada hedef kontrolden veri bağlama nesnesi alınıyor ve onun UpdateSource() metodu çağrılıyor.

İkinci TextBox LostFocus değerini kullanıyor, bu Text özelliğine yapılan veri bağlamanın zaten default davranışı. Bunun anlamı kontrol fokus kaybettiğinde kaynak güncellenecektir.

Üçüncü ve sonuncu TextBox PropertyChanged değerini kullanıyor, bunun da anlamı değeri değiştirdiğiniz anda kaynak güncellenecek, bu durumda anında boyut değişerek pencere ilginç boyutlar alabilir.

Örneği çalıştırın ve her bir TextBox'ı deneyerek çalışmasını inceleyin, her biri farklı: İlk değer siz butona basana kadar etkili olmaz, ikinci değer siz TextBox'tan çıkınca güncellenir, üçüncü ise daha tuşa basıldığı anda güncellenecektir vs.

Sonuç

Kontrollerin veri bağlamasında UpdateSourceTrigger özelliği ne zaman ve nasıl değişen değerin kaynakta güncelleneceğini belirler. Bununla beraber WPF bunu sizin için kontrol etmekte oldukça başarılı olduğu için default değeri çoğu durumda işi görecektir.

Proses üzerinde daha fazla kontrol istediğinizde bu özellik yardımcı olacaktır tabi ki. Sadece kaynağı gereğinden fazla sıklıkta güncelleme yapmadığınızdan emin olun. Eğer tam bir kontrol istiyorsanız Explicit değeri verip güncellemeyi elle yapabilirsiniz, fakat bu veri bağlama olayının biraz dışına çıkıp işin heyecanını kaçıracaktır.


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!