We recently started to build a desktop application with WPF and MVVM.

When we had the need for a validation framework for our view inputs, I started to look on internet to find "de facto" approach for MVVM and WPF in general. There are lots of look-alike methods for validation.

For validation I commonly saw three approaches:

  • Validation Rules on views
  • Hand coded validation on ViewModel setters
  • Using some validation framework attributes (mostly System.ComponentModel.DataAnnotations) on binded Model properties or ViewModel properties.

For validation error user notification, people complain about how WPF lacks old Windows Forms built in Error Provider support and invent their custom ones with IDataErrorInfo interface.

The problems with the implementations I saw so far was they were like toy examples or have overly complex implementations. One implementation outstands for me from the rest.

In Mariano Omar Rodriguez's validation approach, ViewModel decorates its properties with Data Annotations for validation, and to check these attributes are really valid, ViewModel uses some reflection and Linq Expressions. To show errors ViewModel also implements IDataErrorInfo interface. While Mariano's approach seemed a little complex, if I could carry complexity (IDataErrorInfo implementation and reflection methods/properties) to a ViewModelBase class, adding new properties and validations would become fairly easy.

I modified Mariano's code with generics to move all those overhead to a base class. Two things I couldn't carry without friction were IDataErrorInfo's members this[string] indexer and Error property, because these properties send "this" instances to reflective methods for gathering IsValid infos from Data Annotation attributes. I was stuck there for a good solution. My collegue Niyazi came with a solution which suggests we should declare a T type property in ViewModelBase, and use T property instead of "this" in ViewModelBase and actual ViewModels which inherit from ViewModelBase should assign their selves to this generic typed property in their constructors. We were not totally ok with this yet another overhead for the ViewModel. But it's less crappy or less code from other solutions out there. So we settled for this solution.

You can grab the solution attached below. Please feel free to comment on this solution's possible drawbacks.

Samples.Validation.BerkesVariant.rar (83.76 KB)
 
Categories: .NET | C# | In English | MVVM | Teknik | WPF

Başlık herşeyi anlatıyor. Ama söz edilmesi gereken bir kaç değişiklik mevcut tabi ve söz de edilmiş:

Scott Guthrie: Visual Studio 2008 and .NET Framework 3.5 Service Pack 1 Beta
Scott Hanselman: VS2008 and .Net 3.5 SP1 Beta - Should You Fear This Release?
Somasegar's WebLog (MSDN Blogger): Visual Studio 2008 and .NET FX 3.5 SP1 Beta available now

Bir şey eklemek istemiyorum, çünkü eminim MS evanjelistleri onlarca defa aynı şeyi yazmışlardır. ;)

Ekleme:
    (tabii ki) InfoQ: New version of .NET Disguised as a "Service Pack"


 
Categories: .NET | Araçlar | ASP.NET | C# | IDE | Teknik | Visual Studio

IEBlog'dan yapılan açıklamaya göre 2007'nin sonunda (Ekim/Aralık dönemi) yayınlanacak bir "kill bit" i ile MSXML4 nesnesinin Internet Explorer'da oluşturulması engellenecek.

Kullanıcıların, mevcut uygulamalarını MSXML6'ya geçirmesi önerilen yazıda, IE dışındaki uygulamaların bundan etkilenmeyeceği belirtiliyor. MSXML4'in gelecek 12 ay içinde ise Microsoft Download Center'dan kaldırılacağı da buna ek olarak belirtilen bir haber.

IEBlog'da haberin kaynağı olarak Microsoft XML Team's Blog gösteriliyor.
 

Evet sonunda Microsoft yıllardır şiddetini arttırarak gelişen MVC (Model-View-Controller) tabanlı web uygulaması geliştirme akımına dayanamayarak kendi ASP.NET için kendi MVC frameworkünü geliştirmeye başlıyor.

Konuyla ilgili ilk açıklama dolaylı şekilde Scott Guthrie tarafından ama kendi blogunda değil de CodeBetter bloggerı Jeffrey Palermo'dan geldi.

Bildiğiniz gibi MVC mimarisiyle tasarlanan web uygulamaları, klasik ASP.NET deki gibi "page controller", değil de "front controller" olarak çalışıyor. Dolayısıyla klasik bir web sayfasına yapılan istekler bir sayfaya değilde, URL'deki adresin eşlendiği sınıf ve içindeki metodlara gerçekleşiyor. Bu bileşen bütün web uygulamasını kontrol eden "controller", web sayfaları sadece asıl işleri olan sunumla ilgileniyor ki bunlara da "view" deniyor. Son olarak "model" ise iş nesneleri ve veriyi simgeliyor.

Microsoft'un bu konuda girişimlerinin olması Microsoft teknolojileri ile benzeri altyapıları yıllardır zaten sağlayan açık kaynak kodlu proje geliştiricileri arasında tartışmalara sebep oldu. Bu tür MVC desteği sağlayan .NET tabanlı en gelişkin denilebilecek proje Castle ve onun MVC ayağı MonoRail'de de durum farklı değil. Jeffrey Palermo'nun postuna yapılan yorumlarda bazı duayen Castle'cıların, Sun'ın kendi community'sine verdiği desteği göstererek, Microsoft'u kendi communitysini desteklemek yerine, onlara rakip olmakla suçladığı bile görüldü. Microsoft'u savunanlar ise, pazarlama stratejisi yüzünden klasik MS müşterilerinin zaten OSS (Open Source Software)'i tercih etmediklerini ve bu saatten sonra da MS'in kalkıp "MVC istiyorsanız bakın OSS'çu arkadaşlar zaten güzel yapmış onları deneyin..." diyemeyeceğini belirtiyor.

MS MVC gelince (ki Orcas'a bile yetişmesi beklenmiyor) ortalığı karıştıracağa benziyor. Zira Castle developer mailing listelerinde yeni çıkacak Castle MVC framework'ü MonoRail 2'nin hangi özellikler taşıyacağı soruları "rakibe" bilgi sızdırmamak için cevapsız kalıyor...


 
Categories: .NET | ASP.NET | Teknik | Yazılım Mimarisi

February 23, 2007
@ 06:11 PM

Özellikle .NET Framework'un kapalı kaynaklarına girip içsel çalışmasını merak edenlerin vazgeçilmezi Reflector yeni sürümüyle karşınızda...

Reflector 5

(Codeplex) Reflector Add-In'leri (Şiddetle Tavsiye!)

Reflector Tanıtımı (PPT)

Konuyu paylaşan Ken Egozi ve Mitch Denny'ye teşekkür ediyorus...


 
Categories: Teknik