Bu makalede, WPF uygulamalarında veri bağlama ve MVVM desenleri ele alınıyor MVVM, Model-View-ViewModel prensibine dayanan bir mimaridir ve uygulamanın bölümlerinin birbirinden ayrılmış olmasını sağlar INotifyPropertyChanged arayüzü, Command deseni ve Dependency Injection prensibi gibi konular da inceleniyor Veri bağlama, doğru bir şekilde kullanıldığında, kullanıcı arayüzü ile birlikte işlevselliği kolayca sağlayabilir Bu sayede, bir değişiklik meydana geldiğinde UI elementleri de güncellenir MVVM deseninde Model katmanı, uygulamanın ana altyapısını oluşturan önemli bir bileşendir INotifyPropertyChanged arayüzü, sınıfta yer alan özelliklerin değiştiğinde otomatik olarak güncellenmesine imkan tanır

WPF uygulamalarında veri bağlama ve MVVM desenleri oldukça önemli bir yer tutar. Veri bağlama, bir uygulamanın verilerini UI elementleriyle senkronize etme işlemidir. Bu sayede, bir değişiklik meydana geldiğinde UI elementleri de güncellenir.
MVVM deseni ise, Model-View-ViewModel (Model-Görünüm-View Model) prensibine dayanan bir mimaridir. Bu desen, uygulamanın bölümlerinin birbirinden ayrılmış olmasını sağlar.
Bu makalede, WPF uygulamalarında veri bağlama ve MVVM desenlerini ele alacağız. Ayrıca, MVVM deseninin temel unsurunu oluşturan Model, View ve ViewModel hakkında detaylı bilgi vereceğiz. INotifyPropertyChanged arayüzü, Command deseni ve Dependency Injection prensibi gibi konular da incelenecek. Tüm bu konuların anlaşılması, WPF uygulamalarının geliştirilmesinde büyük bir yardımcı olacaktır.
Veri Bağlama Nedir?
WPF uygulamalarında veri bağlama, doğru bir şekilde kullanıldığında, kullanıcı arayüzü ile birlikte işlevselliği kolayca sağlayabilir. Veri bağlama, verileri kaydetmek ve almak için kullanılan standart bir yöntemdir. WPF, kullanıcıların verileri doğrudan doğruya bağlamalarını başlatan öncü platformlar arasındadır.
Bir data-binding örneğinde, bir alışveriş uygulamasındaki alışveriş sepeti bilgileri depolandığında, veriler kaynak kodda programlanmadan, soğutucu, veritabani ya da diger benzeri bir sistemde saklanır. Uygulamalarda bir değişken oluşturun, bu değişkene bir değer atayın ve WPF'de bu değişkeni XAML tarafında kullanın.Yani, verileri şablonların aracılığıyla programlama gerektirmeden yerel bağlamalarla kullanabilirsiniz ve bu esnekliğe sahipsiniz.
MVVM Deseni Nedir?
MVVM, Model-View-ViewModel anlamına gelir ve WPF uygulamalarında sıklıkla kullanılan bir tasarım desenidir. Bu desen, uygulamanın farklı katmanlarının birbirinden ayrılmasını ve ayrı ayrı yönetilebilmesini sağlar. Bu sayede uygulamalar daha da modüler hale gelir ve bakım süreçleri basitleşir.
MVVM, Model-View-Controller (MVC) deseninden esinlenerek oluşturulmuştur. Ancak, MVVM bunun bir türevidir ve bazı farklılıkları vardır. MVC deseninde, View katmanı doğrudan Model katmanı ile iletişim kurarken, MVVM deseninde bu iletişim ViewModel katmanı üzerinden gerçekleşir. Bu sayede, View katmanı ve Model katmanı arasındaki bağımlılık azaltılmış olur.
MVVM deseni, WPF uygulamalarında kullanılmasının sebebi, bu uygulamaların temelinde veri bağlama (data binding) kullanmasıdır. Veri bağlama, XAML dosyalarında yer alan arayüz bileşenlerine bir veri kaynağı belirlenerek, bu bileşenlerin belirlenen veri kaynağına bağlı olmasını sağlar. MVVM deseni ise, bu veri bağlama sürecinde View katmanını Model katmanından ayırarak, kodun daha büyük ölçekte modüler olmasını sağlar.
Model Nedir?
MVVM (Model-View-ViewModel) deseni, WPF uygulamalarının geliştirilmesinde yaygın olarak kullanılan bir tasarım desenidir. MVVM, uygulamayı Mantık(Model), Sunum(View) ve Arayüz(ViewModel) katmanlarına ayırarak kodlama işlemini kolaylaştırır. Bu tasarım deseni sayesinde uygulamanın farklı katmanlarında yapılan değişiklikler birbirinden bağımsız olur.
MVVM Model, uygulamanın temel veri yapısını oluşturur. Model, uygulamanın veritabanından aldığı ya da kullanıcının girdiği verileri işleyerek ViewModel katmanına gönderir. ViewModel katmanından gelen istekler doğrultusunda Model, verileri işleyerek tekrar ViewModel katmanına gönderir.
Model, uygulamanın veri işleme mantığını oluşturduğu için, basit bir veri yapısı taşır. Model katmanında, kullanıcının veri girişlerini tutan, veritabanından çeken ve işleyen metotlar yer alır. Bu kısımda yapılan herhangi bir değişiklik, ViewModel katmanına yansıtılmadan bu katmanda kalır.
Model katmanında kullanılan veri yapısı, verinin türüne ve işleme alınış şekline göre değişebilir. Örneğin, bir veri tabanındaki kullanıcı bilgileri, bir sınıf nesnesinde tutulabilir. Ayrıca, verinin işleme alınış şekline göre verinin formatı da değişebilir. Örneğin, bir değişkene yazılmış bir sayı, yine bir değişkene atanarak tam sayıya dönüştürülebilir.
MVVM deseninde Model katmanı, uygulamanın ana altyapısını oluşturan önemli bir bileşendir. Kodlama işleminin doğru yapılması, Model katmanının doğru oluşturulması ile mümkündür. Bu sebeple, Model katmanı, uygulamanın geliştirilmesi sırasında üzerinde özenle durulması gereken bir katmandır.
INotifyPropertyChanged Arayüzü
Veri bağlama, WPF uygulamalarında oldukça önemli bir konudur. Bu nedenle INotifyPropertyChanged arayüzünün WPF veri bağlamada nasıl kullanıldığına değinmek gerekir. INotifyPropertyChanged arayüzü, bir sınıfta yer alan özelliklerin değiştiğinde otomatik olarak güncellenmesine imkan tanır. Veri bağlama işleminde kullanıcı arayüzünde yer alan bir kontrolün (textbox, label vb.) içeriği değiştiğinde, kullanıcının yaptığı değişikliklerin ViewModel tarafındaki modellere yansıması gerekmektedir. Bunu sağlamanın en uygun yolu ise INotifyPropertyChanged arayüzünü kullanmaktır.
Bir örnek verecek olursak, ViewModel sınıfı içerisindeki Name özelliğinin değişmesi durumunda, INotifyPropertyChanged arayüzü vasıtasıyla bu değişiklik View tarafındaki label kontrolünde de otomatik olarak güncellenebilir. Bu sayede, uygulamanın sürdürülebilirliği de artmış olur.
INotifyPropertyChanged arayüzü, WPF veri bağlamada kullanımı oldukça kolay bir yapıya sahiptir. Bu arayüzü kullanabilmek için, sınıfınızın INotifyPropertyChanged arayüzünü implemente etmesi gerekiyor. Aşağıdaki kod bloğunda verilen örnekte, Person sınıfı INotifyPropertyChanged arayüzünü implemente etmiştir.
```csharppublic class Person : INotifyPropertyChanged{ private string name; public string Name { get { return name; } set { name = value; OnPropertyChanged("Name"); } }
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }}```
Yukarıdaki kod örneğinde görüldüğü gibi, her özelliğe bir "set" metodu eklenir ve bu metod içerisinde OnPropertyChanged metodu çağrılır. Bu sayede herhangi bir özelliğe yapılan değişiklik, View tarafındaki etkileşimli kontrolde otomatik olarak güncellenebilir.
Sonuç olarak, INotifyPropertyChanged arayüzü WPF veri bağlamada oldukça yaygın olarak kullanılan bir arayüzdür. ViewModel tarafındaki değişikliklerin otomatik olarak View tarafındaki etkileşimli kontrolde güncellenmesine olanak tanır. Bu da WPF uygulamalarının sürdürülebilirliği açısından oldukça önemlidir.
Command Deseni
Command deseni, kullanıcının bir işlevi başlatabileceği bir nesne oluşturmak için kullanılır. Bu desen, MVVM uygulamalarında genellikle ViewModel tarafında kullanılır. Command nesneleri, uygulamanın kullanılabilirliğini artırmak için butonlar, menüler ve diğer kontrol öğeleri tarafından kullanılır.
Command deseni, ICommand arabirimiyle uygulanır. Bu arayüz, Execute () ve CanExecute () adlarında iki yöntem içerir. Uygulama tarafından Execute () yöntemi çağrılır ve Command nesnesi bir işlevi yürütür. CanExecute () yöntemi, Command nesnesinin etkinleştirilip etkinleştirilemeyeceğini belirler. Örneğin, bir kaydet düğmesi sadece belirli koşullar sağlandığında etkin olmalıdır. Bu koşullar, CanExecute () yöntemi tarafından belirlenebilir ve ugulamanın görsel arayüzünde düğmenin etkinliğini belirleyebilirsiniz.
Command | CanExecute() | Execute() |
SaveCommand | Belirli koşullar sağlandığında true döndürür | Kaydetme işlevini yürütür |
DeleteCommand | Seçili öğe mevcut olduğunda true döndürür | Silme işlevini yürütür |
Command deseninin bir başka görünümü de RelayCommand sınıfıdır. RelayCommand sınıfının yapısı, belirli bir işlevi ve parametreleri yürütmek için kullanılan bir yöntem içerir. RelayCommand uygulaması, işlevleri bir ViewModel'a 'bağlamanın' en yaygın yoludur ve kod tekrarını azaltır.
- Command deseni, MVVM uygulamalarında kullanılır.
- Command nesneleri, butonlar, menüler ve diğer kontrol öğeleri tarafından kullanılır.
- Command nesnesinin iki yöntem içermesi gerekiyor: Execute () ve CanExecute ().
- RelayCommand, belirli bir işlevi ve parametreleri yürütmek için kullanılan bir yöntem içerir.
View Nedir?
WPF uygulamalarında veri bağlama için en önemli kavramlardan biri de "View" tabanlı tasarımıdır. View, bir WPF kullanıcı arayüzünün temel yapı taşıdır ve UI elemanlarını içerir. Bu elemanlar arasında butonlar, etiketler, metin kutuları, sekmeler ve çok daha fazlası yer almaktadır. Ayrıca, View elemanları da iki tip olarak karşımıza çıkar: "Standart" ve "Özel". Standart elemanlar arayüz yaratırken doğrudan kullanabileceğimiz elemanlardır. Özel elemanlar ise müşteri istekleri doğrultusunda tasarlanan ve özel amaçlar için kullanılan elemanlardır.
WPF uygulamalarında View'ler, MVVM deseninin View ve ViewModel katmanlarının ayrık olduğu bir tasarım modeline dayanır. Bu sayede, View katmanındaki değişiklikler ViewModel'a yansıtılır ve View ve ViewModel arasındaki çift yönlü bağlantı sağlanarak uygulamalar modüler bir şekilde geliştirilebilir. Bu tasarım modeli sayesinde, uygulama tasarımı daha sade ve anlaşılır hale getirilebilir.
Tablo ve listeler de WPF uygulamalarında View tasarımında sıkça kullanılan araçlardır. Tablolar, sütunlar ve satırları olan yapılar halinde verileri görselleştirmek için kullanılırken, listeler ise genellikle veri kümesinin bir listesi veya alt öğeleri şeklinde gösterimi için tercih edilir. Bu yapılar görsel öğeleri düzenlemeye, kolay erişim sağlamaya ve uygulama kullanıcıları için daha kullanışlı ve rahat bir arayüz oluşturmaya yardımcı olurlar.
Sonuç olarak, View WPF uygulamalarında UI elemanlarının oluşturulduğu katmandır. Standart ve özel elemanlar içermekte ve MVVM tasarım deseniyle birlikte kullanılarak, uygulama tasarımı daha modüler ve anlaşılır hale getirilebilmektedir. Tablo ve listeler de View tasarımında sıkça kullanılan araçlar arasındadır ve uygulama kullanıcıları için daha kullanışlı ve rahat bir arayüz oluşturmak için kullanılabilirler.
ViewModel Nedir?
ViewModel, WPF uygulamalarında kullanılan ve MVVM deseninin anahtar bileşeni olan bir yapıdır. ViewModel, Model ve View arasında bir bağlantı görevi görür ve iş mantığı ile arayüz arasında bir köprü görevi görür. Kullanıcı arayüzü, Model verilerini kullanırken ViewModel, Model'deki veriyi görünüme aktarır. ViewModel kısacası WPF uygulamasındaki veriyi Model'den getirir ve View kontrolüne aktarır.
ViewModel yapısı, Model ve View yapısı arasında bir iletişim köprüsüdür ve ViewModel, adından da anlaşılacağı gibi, bir düzenleyici aracıdır. ViewModel, WPF uygulamasının çeşitli kısımlarında kullanılabilir. Örneğin, bir ViewModel hizmeti, bir Listbox gibi bir kontrol için veri kaynağı olarak kullanılabilir ve verinin tüm detaylarını ViewModel yapısında ayarlayabilirsiniz.
Bir başka örnek de bir anket uygulamasıdır. Kullanıcıların seçebileceği birkaç seçenek seçeneği vardır ve bu seçeneklerin her biri ViewModel tarafından işlenir. ViewModel, tüm seçimlerin sayısal bir değere dönüştürülmesini de sağlar.
ViewModel, WPF uygulamalarında kullanıldığında, uygulamayı daha bağımsız ve esnek hale getirir ve uygulamanın bakımı daha kolay hale gelir. ViewModel ve Model arasındaki ilişki, Model'in verilerini daha iyi yönetmeyi ve somutlaştırmayı mümkün kılar. Kullanıcı arayüzünde tüm düzenleme işlemleri ViewModel tarafından gerçekleştirilir, böylece Model'deki veriler değişmeden, kullanıcı arayüzüyle ilgili tüm işlemler yapılabilir.
Dependency Injection
Dependency Injection, yazılım geliştirme dünyasında sıkça kullanılan bir prensiptir. Bu prensip, bir nesnenin bağımlılıklarının, başka bir nesne tarafından enjekte edildiği yerdir. Böylece, kodlar arasındaki bağımlılık azaltılır ve kodun yeniden kullanılabilirliği arttırılır.
WPF uygulamalarında Dependency Injection ile, ViewModel sınıflarının harici bağımlılıklarının enjekte edilmesi ve WPF İçerikleri tarafından kullanılırken işlerinin nasıl yürütüleceğinin belirlenmesi sağlanır. Bu durum, WPF uygulamalarında birçok fayda sağlayarak uygulamanın bakımı ve genişletilmesini kolaylaştırır.
Dependency Injection prensibinde iki tür kullanım vardır:
- Konstruktor enjeksiyonu
- Özellik enjeksiyonu
Bu kullanım biçimlerinden Konstruktor Enjeksiyonu ile bir View'ın ViewModel'ını enjekte edebiliriz. Bu durum, View'nin ViewModel'i altyapı olarak kabul ederken, ViewModel tarafından ise View'nin genel yapısının bilinmemesini sağlar. Özellik Enjeksiyonu ise ViewModel tarafından View içeriklerinin kullanımının gerçekleşmesini sağlar.
Dependency Injection prensibi, basit ama çok yararlı bir prensiptir. Bu prensiple birlikte kodun yeniden kullanılabilir olması, değiştirilebilirlik ve test edilebilir olması sağlanabilir. Bu durum, WPF uygulamalarının büyüyüp geliştikçe daha az kafa karışıklığı yaşanmasına yardımcı olan bir prensiptir.
INotifyPropertyChanged Arayüzü
INotifyPropertyChanged arayüzü, MVVM deseni ile oluşturulan WPF uygulamalarında veri bağlamada kullanılan önemli bir arayüzdür. Bu arayüz, ViewModel tarafında uygulanan değişiklikleri, ilgili View'a bildirerek veri bağlamayı güncellemek için kullanılır.
ViewModel sınıfında, INotifyPropertyChanged arayüzünü implemente etmek için ilk olarak System.ComponentModel namespace'inden gerekli kütüphaneler eklenmelidir. Daha sonra, arayüzün içerisinde yer alan PropertyChangedEventHandler delegate'ini kullanarak PropertyChanged adında bir event tanımlanır.
Bu tanımlanan event, View tarafında yer alan veri bağlamaları eğer ViewModel'da yer alan bir property üzerinde tanımlandıysa, property'de herhangi bir değişiklik yapıldığında tetiklenir. Yani, INotifyPropertyChanged arayüzü ile birlikte kullanıldığında View tarafındaki veri bağlamları otomatik olarak güncellenir.
Bu arayüz, ViewModel tarafında kullanıcı veri girişi sırasında kullanım açısından oldukça kullanışlıdır. Kullanıcı, verileri ara yüz üzerinde değiştirdiğinde, uygulama otomatik olarak ViewModel'da yer alan ilgili property'leri günceller ve PropertyChanged event'ini tetikler.
Bu sayede, diğer bileşenler hesaba katılmadan ViewModel'da bulunan herhangi bir alanın değiştirilmesi otomatik olarak View'da yansıtılır. INotifyPropertyChanged arayüzü, WPF uygulamalarında veri bağlama sürecini kolaylaştırdığı için oldukça önemlidir.