Kafayı yiyecektim arkadaşlar. Yıllardır Windows Forms'da, Button1_Click'in kralı olmuş biriyim. "Şu butona basıldı, hadi şu metni yazdır, sonra şu paneli gizle" mantığı beynime kazınmış. Ta ki proje gereği WPF ve MVVM'e geçene kadar. Meğerse sorun şuradaymış: Ben hala olay (event) peşinde koşan bir avcıyım, WPF ise bana "Kardeşim, verin nerede, onu bağla" diyor.
Zihniyet Değişimi: Kontrolcüden Bağlayıcıya
Windows Forms'ta her şey kontrollere ve onların olaylarına bağlı. Bir TextBox'ın değeri değişti, hemen TextChanged event'ini yakala, içindeki kodu çalıştır. Doğrusal, komut odaklı bir akıl yapısı.
WPF'de ise olaylar ikinci planda. Asıl mesele, Data Binding ve INotifyPropertyChanged. Yani senin ViewModel'indeki bir property değiştiğinde, arayüzdeki ilgili kontrol otomatik olarak güncellenmeli. İlk başta "Yahu bu kadar dolaylı yoldan niye uğraşıyoruz ki?" diye isyan ettim.
İlk Büyük Çuvallama: "Code-Behind" Tuzağı
WPF penceresinin arkasındaki .cs dosyası (Code-Behind) benim için çok tanıdık ve rahat bir alandı. İlk denemelerimde, MVVM falan filan, hadi canım sen de diyerek tüm mantığı oraya yazmaya başladım. Button_Click event'lerinde veritabanına bağlanıp, ListView'ın ItemsSource'unu direkt orada dolduruyordum.
Şaka gibi ama, bir süre sonra XAML tarafındaki bağlamalar (Bindings) çalışmaz oldu, debug etmek imkansız hale geldi ve kod bir Windows Forms projesinden farksız, ama karmaşık bir canavara dönüştü. StackOverflow'da bile "WPF'de neden böyle yapmıyorsunuz?" diye sorduğumda, aldığım ilk cevap "MVVM pattern'i incele" oldu. Haklılardı.
Aydınlanma Anı: Command'lar ve Binding
ICommand interface'ini ve RelayCommand gibi yardımcı sınıfları öğrendiğim an her şey yerine oturmaya başladı. Butona tıklamak bir "olay" değil, ViewModel'deki bir "komutun" (Command) çalıştırılmasıydı. Veri, arayüzü değil; arayüz, veriyi takip ediyordu.
Buradaki sihir, KaydetCommand'ın ve KayitYapilabilir property'sinin arka planda birbirini etkileyebilmesi. Veri değişti, buton otomatik pasif oldu. Windows Forms'ta bunun için onlarca event içinde button.Enabled = false yazardık.
Sonuç: Sabır ve Ödül
Adaptasyon süreci zorlu oldu, ilk haftalar verimlilik dibe vurdu. Ama bir kere data-driven mantığı oturdu mu, özellikle karmaşık, dinamik arayüzler yapmak ve onları sürdürmek inanılmaz kolaylaştı. Unit test yazmak da (eğer Code-Behind'e düşmezseniz) çok daha mümkün hale geliyor.
Siz de Windows Forms'tan WPF'ye geçerken benzer bir beyin yakma yaşadınız mı? MVVM'e alışmak için en iyi ipucunuz ne oldu? Yoksa siz hala Code-Behind'in kralı mısınız? Yorumlara bekliyorum!
Windows Forms'ta her şey kontrollere ve onların olaylarına bağlı. Bir TextBox'ın değeri değişti, hemen TextChanged event'ini yakala, içindeki kodu çalıştır. Doğrusal, komut odaklı bir akıl yapısı.
WPF'de ise olaylar ikinci planda. Asıl mesele, Data Binding ve INotifyPropertyChanged. Yani senin ViewModel'indeki bir property değiştiğinde, arayüzdeki ilgili kontrol otomatik olarak güncellenmeli. İlk başta "Yahu bu kadar dolaylı yoldan niye uğraşıyoruz ki?" diye isyan ettim.
C#:
// Windows Forms Zihniyeti (Eski Ben)
private void textBox1_TextChanged(object sender, EventArgs e)
{
label1.Text = "Merhaba " + textBox1.Text;
}
// WPF Zihniyeti (Yeni Ben - ViewModel'de)
public string KullaniciAdi
{
get { return _kullaniciAdi; }
set
{
_kullaniciAdi = value;
OnPropertyChanged(nameof(KullaniciAdi));
SelamMesaji = "Merhaba " + value; // Bu da başka bir property, o da kendini günceller!
}
}
WPF penceresinin arkasındaki .cs dosyası (Code-Behind) benim için çok tanıdık ve rahat bir alandı. İlk denemelerimde, MVVM falan filan, hadi canım sen de diyerek tüm mantığı oraya yazmaya başladım. Button_Click event'lerinde veritabanına bağlanıp, ListView'ın ItemsSource'unu direkt orada dolduruyordum.
Şaka gibi ama, bir süre sonra XAML tarafındaki bağlamalar (Bindings) çalışmaz oldu, debug etmek imkansız hale geldi ve kod bir Windows Forms projesinden farksız, ama karmaşık bir canavara dönüştü. StackOverflow'da bile "WPF'de neden böyle yapmıyorsunuz?" diye sorduğumda, aldığım ilk cevap "MVVM pattern'i incele" oldu. Haklılardı.
ICommand interface'ini ve RelayCommand gibi yardımcı sınıfları öğrendiğim an her şey yerine oturmaya başladı. Butona tıklamak bir "olay" değil, ViewModel'deki bir "komutun" (Command) çalıştırılmasıydı. Veri, arayüzü değil; arayüz, veriyi takip ediyordu.
XML:
<!-- XAML Tarafı: Artık Click event'i YOK! -->
<Button Content="Kaydet"
Command="{Binding KaydetCommand}"
IsEnabled="{Binding KayitYapilabilir}" />
Buradaki sihir, KaydetCommand'ın ve KayitYapilabilir property'sinin arka planda birbirini etkileyebilmesi. Veri değişti, buton otomatik pasif oldu. Windows Forms'ta bunun için onlarca event içinde button.Enabled = false yazardık.
Adaptasyon süreci zorlu oldu, ilk haftalar verimlilik dibe vurdu. Ama bir kere data-driven mantığı oturdu mu, özellikle karmaşık, dinamik arayüzler yapmak ve onları sürdürmek inanılmaz kolaylaştı. Unit test yazmak da (eğer Code-Behind'e düşmezseniz) çok daha mümkün hale geliyor.
Siz de Windows Forms'tan WPF'ye geçerken benzer bir beyin yakma yaşadınız mı? MVVM'e alışmak için en iyi ipucunuz ne oldu? Yoksa siz hala Code-Behind'in kralı mısınız? Yorumlara bekliyorum!