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

Securing the Supply Chain of Containerized Applications to Reduce Security Risks (Security Scanning, SBOMs, Signing&Verifying Artifacts) – Part 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.…

1 month ago

Delegating Identity & Access Management to Azure AD B2C and Integrating with .NET

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

5 months ago

How to Order Events in Microservices by Using Azure Service Bus (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…

1 year ago

Providing Atomicity for Eventual Consistency with Outbox Pattern in .NET Microservices

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

1 year ago

Building Microservices by Using Dapr and .NET with Minimum Effort – 02 (Azure Container Apps)

{:tr}Bir önceki makale serisinde Dapr projesinden ve faydalarından bahsedip, local ortamda self-hosted mode olarak .NET…

1 year ago

Some Awesome News of .NET 7

{:tr}Bildiğimiz gibi .NET Conf 2022, 8-10 kasım arasında gerçekleşti. Konferans sırasında ise .NET 7 ve…

1 year ago