20 Haziran 2016 Pazartesi

INotifyPropertyChanged

INotifyPropertyChanged
Açıklaması şöyle
The INotifyPropertyChanged interface is used to notify clients, typically binding clients, that a property value has changed.
When value of model is changed it will reflect in the UI.
Bu arayüz modelin değiştiğini view sınıflarına bildirmek için kullanılıyor.

Winforms Ekran Bileşenine Nasıl Bağlarım
Önce en merak edilen şeyi başa koymak istedim. Modelimizi ekran bileşenine şöyle bağlarız.

Elimizde bir TextEdit olsun. editBox nesnesinin DataBindings.Add metodu çağrılır. İlk parametre olarak editBox nesnesinin Text alanı verilir. Daha sonra model nesnem ve model nesnesinin hangi alanını bağlamak istediğimi belirtirim.
editBox.DataBindings.Add("Text", myModel, "Name");
TextBox ta aynı şekil bağlanır.
TextBox txtBox = new TextBox();
txtBox.DataBindings.Add("Text", myModel, "Name");
WPF Ekran Bileşenine Nasıl Bağlarım
Şöyle yaparız.
<TextBox Text="{Binding myModel.Name,
           UpdateSourceTrigger=PropertyChanged}" />

Nasıl Kalıtırım
1. Event Tanımla
public event PropertyChangedEventHandler PropertyChanged;
şeklinde bir event tanımlamak zorunda. Örnek
public class MyModel : INotifyPropertyChanged
{
  ...
  public event PropertyChangedEventHandler PropertyChanged;
  ...
}
2. Event'i Tetikle
Event'i tetiklemek için genellikle bir metod yazarız. Bu metoda değişen property ismi geçilir. Event'i tetikleyen metod şöyle yazılır. Event'i tetiklerken önce bir kopyası alınır ve bu kopya tetiklenir.
public class Item : INotifyPropertyChanged
{
  ...
  public event PropertyChangedEventHandler PropertyChanged;
  protected virtual void OnPropertyChanged(string propertyName)
  {
    var eh = this.PropertyChanged;
    if (eh != null)
      eh(this, new PropertyChangedEventArgs(propertyName));
  }
}
Tüm property'lerin değiştiğini belirtmek için PropertyChangedEventArgs içine null geçilebilir. Örnek'te yine yukarıdakine benzer bir kod var ama bu sefer propertyName null geçilebiliyor.
public class SimonSaysRound : INotifyPropertyChanged
{

    public int Score
    {
        get { return _score; }
        private set
        {
            if (value == _score) return;
            _score = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

Hiç yorum yok:

Yorum Gönder