INotifyPropertyChange Arayüzü
INotifyPropertyChange Arayüzü
Bir nesnede saklanmakta olan durum bilgisinin çeşitli sebeplerle değişimi halinde o nesnenin bind edilmiş olduğu kullanıcı arayüzündeki kontrolün de içeriğinin güncellenmesi gerekir. Bu amaçla .NET kütüphanesine INotifyPropertyChange isimli bir arayüz (interface) eklenmiştir. Bu arayüzü implemente eden bir sınıfa ilişkin nesnenin herhangi bir property’sinde değişme olursa bir event raise edilmek ve yakalanmak suretiyle bind edilen ui elemanı güncellenebilir. Aşağıdaki örnekte CStok sınıfı bu durumu örneklemektedir.
public class CStok : INotifyPropertyChanged
{
private int m_Adet;
public int Adet
{
get { return m_Adet; }
set
{
m_Adet = value;
OnChanged("Adet");
}
}
private string m_Urun;
public string Urun
{
get { return m_Urun; }
set
{
m_Urun = value;
OnChanged("Urun");
}
}
public CStok(string urun, int adet)
{
m_Adet = adet;
m_Urun = urun;
}
public event PropertyChangedEventHandler PropertyChanged;
// Bu event interface'ten geliyor
protected void OnChanged(string prop_name)
{
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop_name));
}
}
}
Bu sınıf görseldeki TextBox’lara programatik olarak bind edilmiştir.
<Window x:Class="csd.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<TextBox Name="txtUrun" />
<TextBox Name="txtAdet" />
<Button Name="button1" Click="button1_Click">Test</Button>
</Grid>
</Window
Butona tıklandığında Adet property’sine yeni değer atanmakta ve bağlı kontrol de aynı anda değişim göstermektedir.
public partial class Window1 : Window
{
CStok stok = new CStok("Buzdolabı", 13);
public Window1()
{
InitializeComponent();
txtUrun.Text = stok.Urun;
txtAdet.Text = stok.Adet.ToString();
stok.PropertyChanged += new
System.ComponentModel.PropertyChangedEventHandler
(stok_PropertyChanged);
}
void stok_PropertyChanged(object sender,
System.ComponentModel.PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "Urun":
txtUrun.Text = stok.Urun;
break;
case "Adet":
txtAdet.Text = stok.Adet.ToString();
break;
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
// Butona basılınca ilgili textbox yei değer atandığı için değişir
stok.Adet = 30;
}
}
Aykut TAŞDELEN
C ve Sistem Programcıları Derneği Eğitmeni
