Silverlight içerisinde validasyon yapma ve uygun mesajları gösterme konusunda kullandığımız sistem Property'ler içerisinde uygun Exception'ları vermekten farklı birşey değildi. Bu konuda Silverlight 3 için yazmış olduğum "Görsel Validasyon" makalesini inceleyebilirsiniz. Silverlight 4 ile beraber gelen yeni IDataErrorInfo ile beraber artık Silverlight içi kodlar da hem WPF hem de Winforms uygulamaları ile aynı altyapı üzerine oturmuş oluyor. Böylece kod paylaşımının yanı sıra yine SL 4'ün yeni özelliklerinden biri olan Assembly Paylaşımı ile birleştirildiğinde ortaya güzel manzaralar çıkabiliyor. Özetle hedeflenen şey aslında farklı platformlarda olsak da bire bir aynı kodu yazıyor olmak ve kod paylaşımını maksimum seviyeye çekmek. Bu çerçevede IDataErrorInfo tek başına yeni birşey olmasa da Silverlight bakış açısı ile yeni bir mekanizma. Bu yazımızda Interface'in implementasyonuna göz atacağız.
[VB]
Public Class Insan
Private AdiField As String
Public Property Adi() As String
Get
Return AdiField
End Get
Set(ByVal value As String)
AdiField = value
End Set
End Property
End Class
Örnek projenizde yukarıdaki şekilde tanımlanmış bir Entity olduğunu varsayalım veya aynı şekilde bu Entity bir web service proxy aracılığı ile de geliyor olabilir. Yani web servisiniz bu nesne tipinden döndürüyor ve bu nesne tipini extend ederek validasyon mesajlarını eklemek isteyebilirsiniz. Genelde web servisi senaryosunun daha gerçekçi olduğunu düşünürsek hemen o senaryo üzerinden devam edebiliriz.
Silverlight uygulamanıza bir kod dosyası ekledikten sonra hemen Partial Class'ınızı yaratarak web servisi ile gelen sınıfı extend etmeye başlayabiliriz.
Imports System.ComponentModel
Namespace ServiceReference1
Partial Public Class Insanlar
Implements IDataErrorInfo
Public ReadOnly Property [Error] As String Implements System.ComponentModel.IDataErrorInfo.Error
Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements System.ComponentModel.IDataErrorInfo.Item
End Namespace
IDataErrorInfo sınıfını implemente ettiğimiz anda bir obje bazında bir de Field bazında hata mesajları verebileceğimiz Property'ler ile karşılaşıyoruz. Field bazında verilen hata mesajları Silverlight 4 içerisindeki bütün kontroller tarafından otomatik algılanarak söz konusu kontrollerin görsel olarak da InValidState'e geçmesine neden oluyor. O nedenle bizim de burada esas ilgileneceğimiz kızım Property bazında validasyon yapmak.
Return Nothing
Dim Hata As String = Nothing
Select Case columnName
Case "Adi"
If String.IsNullOrEmpty(Me.AdiField) Then
Hata = "Adı eksik"
End If
Case "Soyadi"
'BAŞKA VALİDASYONLAR
End Select
Return Hata
Kod içerisinde renkli kısma göz atarsanız Property'mize gelen columnName değişkeni üzerinden hangi kolonla ilgili validasyon yapılmak istendiğine dair mesajı yakalayabildiğimizi görebilirsiniz. Bu mesajı yakaladıktan sonra uygun validasyonu yaparak istediğimiz bir mesaj metnini geri döndürebiliyoruz. Söz konusu mesaj metni otomatik olarak SL kontrolleri tarafından gösterilebiliyor.
IDataErrorInfo'dan gelen validasyon sonucu...
Yukarıdaki ekran görüntüsünde Insanlar nesnemizden bir listenin DataGrid'e bağlanmış halini görebilirsiniz. Özellikle ilk iki kolona baktığınızda Error ve Item olarak Interface tarafından eklenmiş Property'lerin de DataGrid'de gösterildiğini görüyoruz. Bunu engellemek için bu Property'leri uygun metaattribute'ler ile süsleyebiliriz ;)
<DataAnnotations.Display(AutoGenerateField:=False)>
Get ........
Unutmayın IDataErroInfo kullanarak yazılmış Entity'ler rahatlıkla Silverlight dışı WPF ve Winforms ortamlarında da kullanılabilir. Bunun için "Assembly Paylaşımı" konulu makaleye göz atmayı unutmayın.
Hepinize kolay gelsin.