Attached property’ler bildiğiniz gibi dependency property’lerin özelleşmiş bir tipidir.Daha önceki makalelerimde attached property ve dependency property’lerden bahsetmiştim.Bugün bu konuyu daha iyi anlamak için örnek bir attached property yazacağız.Property’miz bir TextBox’a sadece rakam girilmesini sağlayacak yani nümerik TextBox özelliği sağlayacak.Burada yapacağımız en önemli iki hamle ilk olarak clipboard da bulunan verinin TextBox’a yapıştırılmasını engellemek.Burada engellememizin amacı o veriyi inceleyip içinde rakamdan başka veriler olma ihtimalidir.Veriyi inceleyip komutun çalışıp çalışmamasını sağlamalıyız.

Son hamlemiz ise TextBox’a her bir  veri girişini yakalayıp rakam olup olmadığını kontrol etmemiz gerekmektedir.Önceki makalelerimde de belirttiğim gibi attached property ler farklı sınıflarda bulunmaktadırlar.Öncelikle NumericTextBox adında bir sınıf oluşturuyorum ve bu sınıfta boolean tipinde IsEnabled adında bir attached property tanımlıyorum. UIPropertyMetadata’sında varsayılan değerini false olarak atayıp değer her değiştiğindeki olayı yakalamak için aşağıdaki gibi OnIsEnabledPropertyChanged adında bir static metot yazıyorum:

public static void OnIsEnabledPropertyChanged(DependencyObject sender,DependencyPropertyChangedEventArgs e)  
 {
   TextBoxBase txtBox = sender as TextBoxBase;
   txtBox.PreviewKeyDown -= OnKeyDown;
   DataObject.RemovePastingHandler(txtBox, OnClipboardPaste);
   if ((bool)e.NewValue)
    {
      txtBox.PreviewKeyDown += OnKeyDown;
      DataObject.AddPastingHandler(txtBox, OnClipboardPaste);
    }
  }

Burada ilgili TextBox’ın OnKeyDown ve clipboard yapıştırma olay tutucusu siliniyor.Çünkü sadece attached property’miz true olduğu sürece rakam kontrolünü yapması gerekiyor.OnClipboardPaste event handler’ında  clipboard’daki bulunan veriyi alıp içinde tüm verinin rakam olup olmadığını kontrol etmeliyiz.Eğer harf ya da alfanümerik  karakterler varsa komutun çalışmasını engellemeliyiz:

private static void OnClipboardPaste(object sender,DataObjectPastingEventArgs e)  
   {
       string text = e.SourceDataObject.GetData(e.FormatToApply) as string;
       if (!string.IsNullOrEmpty(text))
        {
           if (text.Count(p=>!Char.IsNumber(p))==0)
             {
                return;
             }
        }
       e.CancelCommand();
   }

OnKeyDown event handler’ında ise Enter,CTRL ve Shift gibi bazı özel karakterler ve rakamlar haricinde TextBox’a veri girişini e.Handled özelliğini true yaparak engellemeliyiz.Son olarak yazdığımız attached property’i kullanabilmek için sınıfımızı XAML tarafında isim uzayına eklemeliyiz.Daha sonra aşağıdaki gibi property’mizi set edebiliriz.

<TextBox Width="180" local:NumericTextBox.IsEnabled="True"/>

Uygulamanın kaynak kodlarına aşağıdaki linkten ulaşabilirsiniz.

Kaynak Kod-NumericTextBox.zip (37,54 kb)

About the Author