Categories: WPF

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.

 

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

INotifyPropertyChangedExample

 

Gökhan Gökalp

View Comments

  • ö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.

Recent Posts

Event-Driven Architecture’larda Conditional Claim-Check Pattern’ı ile Event Boyut Sınırlarının Üstesinden Gelmek

{:en}In today’s technological age, we typically build our application solutions on event-driven architecture in order…

2 ay ago

Containerized Uygulamaların Supply Chain’ini Güvence Altına Alarak Güvenlik Risklerini Azaltma (Güvenlik Taraması, SBOM’lar, Artifact’lerin İmzalanması ve Doğrulanması) – Bölüm 1

{:tr}Bildiğimiz gibi modern yazılım geliştirme ortamında containerization'ın benimsenmesi, uygulamaların oluşturulma ve dağıtılma şekillerini oldukça değiştirdi.…

9 ay ago

Identity & Access Management İşlemlerini Azure AD B2C ile .NET Ortamında Gerçekleştirmek

{:tr}Bildiğimiz gibi bir ürün geliştirirken olabildiğince farklı cloud çözümlerinden faydalanmak, harcanacak zaman ve karmaşıklığın yanı…

1 yıl ago

Azure Service Bus Kullanarak Microservice’lerde Event’ler Nasıl Sıralanır (FIFO Consumers)

{:tr}Bazen bazı senaryolar vardır karmaşıklığını veya eksi yanlarını bildiğimiz halde implemente etmekten kaçamadığımız veya implemente…

2 yıl ago

.NET Microservice’lerinde Outbox Pattern’ı ile Eventual Consistency için Atomicity Sağlama

{:tr}Bildiğimiz gibi microservice architecture'ına adapte olmanın bir çok artı noktası olduğu gibi, maalesef getirdiği bazı…

2 yıl ago