İlkay İlknur

just a developer...

Silverlight Toolkit - DataForm İçerisindeki Kontrollere Erişim

Merhaba Arkadaşlar, Bu yazımızda Silverlight Toolkit içerisinde bulunan DataForm kontrolünü özelleştirilmiş bir şekilde kullanırken içerisindeki kontrollere nasıl erişebiliriz bu konuya bakıyor olacağız. Silverlight içerisinde normalde kontrollere isim vererek C# içerisinden bu kontrollere erişebilmekteyiz. Ancak DataForm durum biraz daha farklı.  Örnek olarak DataForm kontrolünün Ürün tipinde bir sınıfı gösterdiğini düşünelim ve DataForm kontrolünü özelleştirerek içerisine bir TextBlock ekleyelim ve ürün sınıfı içerisindeki adet ve fiyat bilgilerini çarparak bu textblock a yazdıralım. İlk olarak Ürün sınıfını yazarak başlayalım.
public class Urun
{
   public string urunAdi { get; set; }
   public double fiyat { get; set; }
   public int adet  { getset; }
}
Daha sonra ise Ürün sınıfını gösterecek olan DataForm kontrolünü tasarlayalım.
<UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm.Toolkit" x:Class="SilverlightApplication18.MainPage"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400">
<Canvas x:Name="LayoutRoot" Background="White">
  <my:DataForm x:Name="dfUrunler" Height="266" Width="283" Canvas.Left="8" Canvas.Top="8">
    <my:DataForm.EditTemplate>
      <DataTemplate>
        <StackPanel>
          <my:DataField Label="Ürün Adı">
            <TextBlock Text="{Binding urunAdi}"/>
          </my:DataField>
          <my:DataField Label="Birim Fiyat">
            <TextBlock Text="{Binding fiyat}"/>

          </my:DataField>

          <my:DataField Label="Adet">

            <TextBlock Text="{Binding adet}"/>

          </my:DataField>

          <my:DataField Label="Toplam Fiyat">

            <TextBlock x:Name="tbTotal"/>

          </my:DataField>

          <my:DataField>

            <Button Click="Button_Click" Height="30" Width="60" Content="Hesapla"/>

          </my:DataField>

        </StackPanel>

      </DataTemplate>

    </my:DataForm.EditTemplate>

  </my:DataForm>

</Canvas>

</UserControl>

Normalde isim verdiğimiz tbTotal kontrolüne C# tarafından erişebilmemiz gerekir. Ancak Template içerisinde bulunduğundan dolayı bu kontrole ulaşamıyoruz. Bunun için DataForm'un ContentLoading eventi içerisinde TextBlock'un referansını DataForm'un FindInContent metodunu kullanarak almamız gerekiyor. TextBlock block;
void dfUrunler_ContentLoading(object sender, DataFormContentLoadEventArgs e)
{
   block = dfUrunler.FindNameInContent("tbTotal") as TextBlock;
}
Daha sonra ise DataForm içerisindeki Buton'un Click eventinde gerekli hesaplamayı gerçekleştirmemiz gerekiyor. private void Button_Click(object sender, RoutedEventArgs e) {     Urun urun = dfUrunler.CurrentItem as Urun;     block.Text = (urun.fiyat * urun.adet).ToString(); } Artık başarılı bir şekilde TextBlock kontrolüne erişebilmekteyiz. Deneme amaçlı olarak birkaç veri üretelim ve uygulamayı çalıştıralım. void MainPage_Loaded(object sender, RoutedEventArgs e) {    List<Urun> urunler = new List<Urun>()    {        new Urun(){urunAdi="İskender",fiyat=10,adet=2},        new Urun(){urunAdi="Kebap",fiyat=9,adet=3},        new Urun(){urunAdi="İçli Köfte",fiyat=7,adet=4}    };    dfUrunler.ItemsSource = urunler; }   Not: Kontrolün referansına sadece ContentLoading eventi içerisinde erişebilmekteyiz. Başka metotlar içerisinde FindInContent metodu çağrılırsa ilgili kontrole erişememekteyiz. Bu nedenle Null Reference hataları ile karşılaşabiliriz. Görüşmek Üzere, Herkese Kolay Gelsin


Yorum Gönder