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.
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. 🙂
{:tr} Makalenin ilk bölümünde, Software Supply Chain güvenliğinin öneminden ve containerized uygulamaların güvenlik risklerini azaltabilmek…
{: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.…
{:tr}Bildiğimiz gibi bir ürün geliştirirken olabildiğince farklı cloud çözümlerinden faydalanmak, harcanacak zaman ve karmaşıklığın yanı…
{:tr}Bazen bazı senaryolar vardır karmaşıklığını veya eksi yanlarını bildiğimiz halde implemente etmekten kaçamadığımız veya implemente…
{:tr}Bildiğimiz gibi microservice architecture'ına adapte olmanın bir çok artı noktası olduğu gibi, maalesef getirdiği bazı…
{:tr}Bir önceki makale serisinde Dapr projesinden ve faydalarından bahsedip, local ortamda self-hosted mode olarak .NET…
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.
fulname için set alanı da gereksiz sadece get yeterli