Skip to content

WPF INotifyPropertyChanged Nedir ve Implementasyonu

Merhaba arkadaşlar, WPF’e giriş makalemi binding modları üzerinde yapmıştım ve şimdi en az bindingsler kadar önemli olan INotifyPropertyChanged arayüzü nedir ve nasıl implemente edilir onun üzerinde duracağız.

Ne işe yarar bu INotifyPropertyChanged arayüzü?

Bir property’nin(özelliğin) değeri değiştiği zaman bu değişimi eş zamanlı olarak view(arayüz) kısmına bildirilmesini sağlar.

Daha iyi anlayabilmek için basit bir örnek yapalım.

Örneğimizde Gird içerisinde 2 adet TextBox yer alacak ve bunlar TwoWay şeklinde bind olacaklar ilgili Person modelinin propertylerine. Person modeli ise sadece Name, Lastname ve Fullname propertylerine sahip olup, INotifyPropertyChanged arayüzünü implemente edecek. Sonrasında ise bir Label içerisinde Fullname‘i göstereceğiz.

Buradaki nokta Fullname propertysi bize TextBox‘lardan girilen Name ve Lastname propertylerinin birleşmiş hallerini verip eş zamanlı olarak TextBox’lar üzerinde her değişim gerçekleştiğinde Label içinde de değişimini sağlamış olacağız.

Önce Person modelimizi oluşturalım:

using System.ComponentModel;

namespace INotifyPropertyChangedExample.Models
{
    public class Person : INotifyPropertyChanged
    {
        #region Properties
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                OnPropertyChanged("Name");
                OnPropertyChanged("FullName");
            }
        }

        private string _lastname;
        public string Lastname
        {
            get { return _lastname; }
            set
            {
                _lastname = value;
                OnPropertyChanged("Lastname");
                OnPropertyChanged("FullName");
            }
        }

        private string _fullname;
        public string FullName
        {
            get { return string.Format("{0} {1}", _name, _lastname); }
            set
            {
                _fullname = value;
                OnPropertyChanged("FullName");
            }
        }
        #endregion

        #region INotifyPropertyChanged Implementing
        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }
}

Sınıfımızı oluşturduk ve INotifyPropertyChanged arayüzünü implemente ettik. Bu arayüz ile bize PropertyChanged isminde bir event geldi. Implementasyonunu ise değişen propertynin ismini alacak olan void tipinde OnPropertyChanged metodunu oluşturup event’i tanımladık.

Not: Değişen propertynin ismini alabilmek için parametre olarak string bir değişken kullandık, .Net 4.5 ve üzeri framework versiyonları için CallerMemberNameAttribute aracılığı ile daha kolay handle edebiliriz. Parametre olarak “[CallerMemberName] string propertyName = null” şeklinde geçmemiz ve notify ederken set metodu içerisinde OnPropertyChanged() şeklinde çağırmamız yeterli olacaktır ve ilgili propertynin ismini otomatik olarak alacaktır.

Modelimizi tanımladığımıza göre şimdi View kısmına geri dönebiliriz:

<Window x:Class="INotifyPropertyChangedExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:INotifyPropertyChangedExample"
        xmlns:m="clr-namespace:INotifyPropertyChangedExample.Models"
        mc:Ignorable="d"
        Title="INotifyPropertyChanged Test" Height="120" Width="320">
    <Window.Resources>
        <m:Person x:Key="person"/>
    </Window.Resources>
    <Grid DataContext="{Binding Source={StaticResource person}}">
        <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" Width="300">
            <TextBlock>
                <Label Content="İsim:" HorizontalAlignment="Left" Width="60"/>
                <TextBox Text="{Binding Name, Mode=TwoWay}" HorizontalAlignment="Left" VerticalAlignment="Center" Width="200"/>
            </TextBlock>
            <TextBlock>
                <Label Content="Soyisim:" HorizontalAlignment="Left" Width="60"/>
                <TextBox Text="{Binding Lastname, Mode=TwoWay}" HorizontalAlignment="Left" VerticalAlignment="Center" Width="200"/>
            </TextBlock>
            <TextBlock>
                <Label Content="Tam İsim:" HorizontalAlignment="Left" Width="60"/>
                <Label Content="{Binding FullName}" HorizontalAlignment="Left" Width="200"/>
            </TextBlock>
        </StackPanel>
    </Grid>
</Window>

xmlns:m attributu ile gerekli Models namespace’imizi tanımladığımıza göre Window.Resources nodu altında gerkeli modelimizi ekliyoruz. Grid’in DataContext özelliğinede person modelimizi source olarak gösteriyoruz.

Gerekli binding işlemlerinide görebileceğiniz üzere basitçe gerçekleştiriyoruz.

Son ekran görüntüsü bu şekildedir.

notify

 

Örnek projeye ekten ulaşabilirsiniz. Bir sonraki makalemde görüşmek dileğiyle. 🙂

INotifyPropertyChangedExample

 

Published inWPF

2 Comments

  1. mehmet mehmet

    örnek güzel ama gereksiz alanlar var dostum. kafa karışıklığına sebep olabilir. Name ve Surname modu twoway olduğu için ayrıca propertychanged eventi ne gerek yok. Fullname içinde set olma durumu olmadığından yine propertychanged eventi gereksiz.

    • Hakan Hakan

      fulname için set alanı da gereksiz sadece get yeterli

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.