Makale Özeti

Bu yazımızda Silverlight 4 Beta ile beraber gelen IDataErroInfo interface'ini ve getirdiklerini inceliyoruz.

Makale

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.

[VB]

Imports System.ComponentModel

Namespace ServiceReference1

    Partial Public Class Insanlar

        Implements IDataErrorInfo

 

        Public ReadOnly Property [Error] As String Implements System.ComponentModel.IDataErrorInfo.Error

            Get

 

            End Get

        End Property

 

        Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements System.ComponentModel.IDataErrorInfo.Item

            Get

 

            End Get

        End Property

    End Class

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.

[VB]

Imports System.ComponentModel

Namespace ServiceReference1

    Partial Public Class Insanlar

        Implements IDataErrorInfo

 

        Public ReadOnly Property [Error] As String Implements System.ComponentModel.IDataErrorInfo.Error

            Get

                Return Nothing

            End Get

        End Property

 

        Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements System.ComponentModel.IDataErrorInfo.Item

            Get

                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

            End Get

        End Property

    End Class

End Namespace

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...
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 ;)

[VB]

        <DataAnnotations.Display(AutoGenerateField:=False)>

        Public ReadOnly Property [Error] As String Implements System.ComponentModel.IDataErrorInfo.Error

            Get

                Return Nothing

            End Get

        End Property

 

        <DataAnnotations.Display(AutoGenerateField:=False)>

        Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements System.ComponentModel.IDataErrorInfo.Item

            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.