İlkay İlknur
Just a developer...

WCF-SelfHosting-Görsel Ders

Pazartesi, 22 Mart 2010 17:51 by ilkayilknur

Merhaba Arkadaşlar,

Bu görsel dersimizde WCF Hosting türlerinden biri olan SelfHosting türünü inceliyor olacağız.

Get Microsoft Silverlight

Görsel dersi buradan indirebilirsiniz.

Görüşmek Üzere,

Categories:   Görsel Ders | WCF
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (0) | Yorumlar RSSRSS Yorum Takibi
Share

Silverlight - DataGrid İçerisinde Gruplama

Pazar, 21 Mart 2010 14:02 by ilkayilknur

Merhaba Arkadaşlar,

Bu yazımızda Silverlight DataGrid içerisindeki gruplama özelliğinden bahsedeceğiz. DataGrid içerisinde bulunan bu gruplama özelliği ile verilerimizi çok daha anlamlı bir şekilde gruplanmış olarak kullanıcılara gösterebilmekteyiz. Gruplama örneğimizi yapmak için DataGrid içerisinde makalelerin listelendiği bir senaryo düşüneceğiz ve bu Makaleleri kategorilerine göre gruplayacağız. İlk olarak DataGrid içerisinde listeleyeceğimiz Makale sınıfını yaratarak uygulamayı gerçekleştirmeye başlayacağız.

public class Makale
{
   public string Baslik { get; set; }
   public string Kategori { get; set; }
}

Daha sonra ise sahneye basit bir DataGrid ekleyeceğiz. XAML tarafında herhangi bir ayar yapmayacağız. Sadece isim vermemiz şuan için yeterli.

<sdk:DataGrid x:Name="dgMakaleler" Height="156" Margin="12,12,0,0" 

VerticalAlignment="Top" HorizontalAlignment="Left" Width="388" />

DataGrid içerisinde gruplamayı sağlamak için System.Windows.Data namespace'i altında bulunan PagedCollectionView tipinden yararlanacağız. Ancak bu sefer DataGrid'in ItemsSource propertysine doğrudan kendi koleksiyonumuzu vermek yerine yarattığımız PagedCollectionView nesnemizi veriyor olacağız. Tabi ki önceden yarattığımız koleksiyonu PagedCollectionView'a geçirip ve gerekli gruplamaları tanımladıktan sonra bu işlemi yapıyor olacağız. 

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
   List<Makale> makaleler = new List<Makale>()
   {
      new Makale()
      {
         Baslik="Dinamik Yenilikler",Kategori="C# 4.0"
      },
      new Makale()
      {
         Baslik="Silverlight 4.0 RC",Kategori="Silverlight"
      },
      new Makale()
      {
         Baslik="Expander Kontrolü",Kategori="Silverlight"
      },
      new Makale()
      {
         Baslik="Optional and Named Parameters",Kategori="C# 4.0"
      }
   };
   PagedCollectionView pcw = new PagedCollectionView(makaleler);
   pcw.GroupDescriptions.Add(new PropertyGroupDescription("Kategori"));
   dgMakaleler.ItemsSource = pcw;
}

Gördüğümüz gibi PagedCollectionView'ın GroupDescriptions koleksiyonu içerisine bir PropertyGroupDescription ekledik ve Kategori propertysine göre listeleme yapacağımızı belirttik. Şimdi uygulamayı çalıştıralım ve DataGrid'in görünümüne bakalım.

Evet ! Makaleler kategorilerine göre gruplanmış durumda. Tabi ki burada akla şu soru geliyor sadece tek bir propertye göre mi gruplayabiliyoruz  ? Hayır, GroupDescriptions koleksiyonu içerisine istediğiniz kadar property yazabilirsiniz. Böylece adete DataGrid içerisinde bir ağaç varmış gibi bir görünüm elde edebilirsiniz. Tabi bu kadar fazla propertye göre gruplama yapmak performansı biraz düşürecektir. ancak özellikle bu gruplama özelliğinin iş uygulamalarında oldukça faydalı olduğunu söyleyebilirim.

Görüşmek Üzere,

Categories:   Silverlight 3.0 | Silverlight 3.0 | Silverlight 3.0 | Silverlight 3.0 | Silverlight | Silverlight
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (0) | Yorumlar RSSRSS Yorum Takibi
Share

Visual Studio 2010 RC WCF Servis Referansı Eklerken Collection Tipi Olarak ObservableCollection'ın Bulunmaması Problemi

Perşembe, 18 Mart 2010 21:38 by ilkayilknur

Merhaba Arkadaşlar,

Geçtiğimiz günlerde Silverlight 4 RC'nin çıkmasıyla beraber bitirme projemi de Visual Studio 2010 RC ve SL 4 RC üzerine geçirdim. Tam sorunsuz bir şekilde çalışırken WCF servisime ve SL tarafındaki servis referansını update ettim. Bir önceki Beta versiyonunda servis referansını update ederken sürekli hata alıyordum hatta bazen VS'yi kapatıp açmam bile gerekebiliyordu. Tam bu sorunların düzeldiğini düşünürken çok ilginç bir şeyle karşılaştım. 

Servis referansında collectionların çevirileceği tipin Custom olduğu yazılıyordu. Bu nedenle projemde haliyle pekçok hata aldım. Sorunu biraz araştırdığımda bir bug ile karşı karşıya olduğumu anladım ve kolay bir çözüm yolu buldum ve sizinle paylaşacağım. 

Çözümü

Öncelikle Collection Type olarak Custom değil başka herhangi bir tipi seçmemiz gerekmekte. Örneğin System.Collections.ObjectModel.Collection olabilir. Daha sonra Solution Explorer içerisinden Show All Files seçeneğine tıklıyoruz ve Service Reference altındaki Reference.svcmap altındaki Reference.cs veya Reference.vb dosyasını açıyoruz. Son olarak bu dosya içerisindeki başlangıçta collection tipini System.Collections.ObjectModel.ObservableCollection olarak değiştiriyoruz.

 

Daha sonra uygulamayı derlediğimiz zaman uygulamamızdaki collectionlar yine sorunsuz bir şekilde ObservableCollection'a çevirilecektir. Bu sorunla ilgili kararlı sürümden önce bir patch çıkarılıp çıkarılmayacağı ile ilgili bir bilgi verilmiyor. Ancak release tarihinin de oldukça yaklaşmasından dolayı herhangi bir patch çıkarılması çokta olası görünmüyor. Ancak sorun release sürümünde tamamen giderilmiş.

Categories:   Visual Studio 2010
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (0) | Yorumlar RSSRSS Yorum Takibi
Share

Silverlight 4 RC, Expression Blend 4 Beta veee Windows Phone Üzerinde Silverlight Uygulama Geliştirme İmkanı

Pazartesi, 15 Mart 2010 20:10 by ilkayilknur

Merhaba Arkadaşlar,

Uzun süredir heyecanla beklediğim MIX'10 konferansı başladı. Birkaç hafta önceden twitterda MIX'te birçok yeniliğin açıklanacağını belirtmeye çalışmıştım(Ancak maalesef yeniliklerin içeriğini bildiğim halde paylaşma imkanım yoktu Smile). Neyse , az önce MIX'10 konferansında ilk gün keynote oturumu sona erdi ve beklediğim gibi son derece efsanevi hareketlere sahne oldu. İlk olarak duyurulan Silverlight 4 RC oldu. Silverlight ile artık Visual Studio 2010 RC ortamında geliştirme yapabilir durumdayız. Silverlight 4 RC ile beraber tasarım tarafında da Expression Blend 4 Beta duyuruldu ve indirilmeye sunuldu. İlgi çekici bir haber de Expression Blend 4 'e Expression Blend 3'ten yükseltmenin ücretsiz yapılacağıydı. Silverlight 4 RC sürümü ile beraber bir takım yeni özellikler de gelmiş durumda. Ayrıca bir takım değişiklikler de yapılmış durumda. Tüm bu yeniliklere Silverlight Program Manager Tim Heuer'in yazısından ulaşabilirsiniz.  Silverlight 4'ün final sürümüne ise gelecek ay muhtemelen Visual Studio 2010'un çıkış tarihinden sonra ulaşabileceğiz. Dikkat etmemiz gereken noktalardan biri de Silverlight 4 RC ile de go-live lisansının gelmemesi. Tüm yeniliklere aşağıdaki linkleri kullanarak ulaşabilirsiniz. 

Silverlight 4 Tools for Visual Studio 2010 RC

Expression Blend 4 Beta

Silverlight Toolkit March 2010 Release 

MIX'10'da açıklanan en efsanevi hareket ise hiç şüphesiz Windows Phone üzerinde Silverlight ile uygulama geliştirme imkanı idi. Windows Phone üzerinde aynı klasik silverlight uygulaması geliştirir gibi aynı kod ve aynı toolları kullanarak uygulamalar geliştirebileceğiz. Visual Studio 2010 ve Expression Blend üzerinde designerlar yardımıyla uygulamayı tasarlayabilir ve yine bu uygulamalar içerisindeki emulatorü kullanarak uygulamayı çalıştırabiliriz. Aynı zamanda uygulamayı elimizdeki Windows Phone'a bağlayarak ta anında çalıştırabilir durumda olacağız. Windows Phone tarafında uygulama geliştirme araçları şuan CTP sürümünde ve biz uygulama geliştiricilerin kullanımına sunulmuş durumda. Windows Phone üzerinde uygulama geliştirme için gereken toollara aşağıdan ulaşabilirsiniz.

Windows Phone Developer Tools CTP

Expression Blend 4 Add-on for Windows Phone Development

Expression Blend 4 Windows Phone SDK

Ne diyelim herkese iyi eğlenceler ve uykusuz geceler Smile

Categories:  
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (0) | Yorumlar RSSRSS Yorum Takibi
Share

.NET Framework 4.0 - Parallel.For ve Parallel.Foreach ile Döngülerin Paralel Olarak İşletilmesi

Cuma, 12 Mart 2010 12:08 by ilkayilknur

Merhaba Arkadaşlar,

.NET Framework 4.0 ile beraber gelecek olan paralel programlama altyapısına göz atacağımız ilk yazımızda basit olarak for ve foreach döngülerini nasıl paralel bir şekilde çalıştırabiliriz bunu inceliyor olacağız. Paralel olarak for ve foreach döngülerini çalıştırmak için TPL(Task Parallel Library) içerisinde bulunan metotları kullanıyor olacağız. TPL içerisinde bulunan For ve Foreach metotları sayesinde düngülerin paralel bir şekilde işletilmesi için gereken tüm işlemler TPL tarafından otomatik olarak ele alınmaktadır. Bizim yapmamız gereken ise sadece ilgili değerleri vermek. Öncelikle for ve foreach döngülerini nasıl paralel bir şekilde çalıştırabiliriz bunu incelemeye çalışalım. Paralel döngüler için Parallel tipi içerisinde bulunan For ve Foreach metotlarını kullanıyoruz. For metodunun parametrelerine bakarsak.

Parallel.For(int fromInclusive, int toExclusive, Action<int> body)

  • fromInclusive : For döngüsünün başlayacağı değer.
  • toExclusive : For döngüsünün döneceği son değer.
  • body : For döngüsünün içerisinde yapılacak işlemler. 
Body parametresinin tipi Action<int> olarak görülmektedir. Yani biz bu parametre için C# 3.0 ile beraber gelen lambda ifadelerini kullanabiliriz.Wink Temel kullanım ise şu şekilde:

 //0'dan 9'a kadar dönen for döngüsü
Parallel.For(0,10,p=>
{
   //İşlemler
});

Foreach metoduna baktığımızda ise yine for döngüsüne benzer bir imza ile karşılaşıyoruz.

Parallel.Foreach(IEnumerable<TSource> source, Action<TSource> body)

  • source : Foreach işlemi boyunca içerisinde dolaşacağımız IEnumerable arayüzünü implemente etmiş olan koleksiyon
  • body : Foreach döngüsü içerisinde ele alacağımız işlemler.
Foreach döngüsünün de temel kullanımı şu şekilde:

IEnumerable<int> numbers = Enumerable.Range(1,1000);
Parallel.ForEach(numbers, p =>
    {
        //numbers hangi tipi taşıyan koleksiyon ise 
       //p parametresi de o tipte
      //işlemler
    });

Basit olarak for ve foreach döngülerinin nasıl parallelize edildiğini görmüş olduk. Şimdi ise bir örnek üzerinde for ve foreach döngülerini kullanalım ve biraz daha derine inerek ne gibi işlemler gerçekleşiyor ve döngüler nasıl işletiliyor incelemeye çalışalım. Aşağıdaki gibi bir Çalışan sınıfımız olduğunu düşünelim ve çalışanların toplam alacağı ücretleri paralel bir şekilde hesaplayalım ve daha sonra ekrana yazdıralım.

public class Calisan
{
    public int ID { get; set; }
    public double SaatlikUcret { get; set; }
    public double ToplamCalisma { get; set; }
}

Elimizde çeşitli değerler ile yaratılmış olan bir Calisan listesi olduğunu düşünelim ve paralel foreach döngüsü ile gerekli hesaplamayı yaparak Console'a sonuçları yazdıralım.

static void Hesapla(List<Calisan> calisanlar)
{
    Parallel.ForEach(calisanlar, calisan =>
            {
               double total = calisan.SaatlikUcret * calisan.ToplamCalisma;
               Console.WriteLine("{0} numaralı çalışanın alacağı toplam ücret:{1}\n",calisan.ID,total);
            });
}

Son olarak listeyi yaratacağımız ve çeşitli çalışan nesneleri ile doldurup Hesapla metodunu çağıracağımız Main metot ise şu şekilde.

static void Main(string[] args)
{
    List<Calisan> calisanlar = new List<Calisan>()
    {
        new Calisan(){ID=1,SaatlikUcret=10,ToplamCalisma=30},
        new Calisan(){ID=2,SaatlikUcret=12,ToplamCalisma=34},
        new Calisan(){ID=3,SaatlikUcret=8,ToplamCalisma=38},
        new Calisan(){ID=4,SaatlikUcret=14,ToplamCalisma=39},
        new Calisan(){ID=5,SaatlikUcret=18,ToplamCalisma=37},
    };
    Hesapla(calisanlar);
}

Uygulamayı çalıştırıp sonuçlara bakarsak.

Gördüğümüz gibi listeye çalışan nesnelerini ID'leri sıralı olacak şekilde eklememize rağmen foreach döngüsü içerisinde farklı sıralarda işletildiğini görmekteyiz. Uygulamayı her çalıştırdığımızda ise sürekli olarak farklı sonuçlarla karşılaşmamız oldukça normaldir. Bunun nedeni ise foreach döngüsü içerisinde paralel işlemek için yaratılan threadlerin işlemci tarafından farklı sıralarda işleme alınmasıdır. Bunu görmek için Hesapla metodunu aşağıdaki gibi değiştirip uygulamayı yeniden çalıştırırsak daha kolay bir şekilde threadleri takip edebiliriz.

static void Hesapla(List<Calisan> calisanlar)
{
    Parallel.ForEach(calisanlar, calisan =>
            {
                 int threadid = Thread.CurrentThread.ManagedThreadId;
                 double total = calisan.SaatlikUcret * calisan.ToplamCalisma;
                 Console.WriteLine("İşlem {0} nolu thread tarafından gerçekleştirildi.\n
                 {1} numaralı çalışanın alacağı toplam ücret:{2}\n",threadid,calisan.ID,total);
            });
}

 

Çıkan sonuçlara baktığımızda hemen hemen herbir çalışanın toplam alacağı ücret farklı bir thread üzerinden hesaplandığını görmekteyiz. Tabi her çalıştırdığımızda farklı bir sonuç görmemiz normal bir durumdur. Bazen tek bir thread id'ye sahip olan bir thread üzerinden de işlemler yapılabilir.

Yazımızın sonuna gelirken kısaca bir özetlersek basit olarak for ve foreach döngülerini Task Parallel Library kullanarak nasıl parallelleştirebiliriz bu konu üzerinde durduk ve birkaç basit örnek yaptık. İlerleyen yazılarda da daha kompleks senaryolar üzerinde duracağız ve döngülerin paralelleştirilmesini daha da detaylı bir şekilde inceleyeceğiz.

Şimdilik bu kadar,

Görüşmek Üzere,

Categories:  
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (5) | Yorumlar RSSRSS Yorum Takibi
Share

Visual Studio 2010 Tips #10 - Kodun İstenilen Kısımdan Görünmez Hale Getirilmesi (Hide Selection)

Çarşamba, 10 Mart 2010 23:29 by ilkayilknur

Merhaba Arkadaşlar,

Visual Studio 2010 Tips yazı serimizin 10. yazısında kaynak kodların istenilen kısmından kapatılabilmesi özelliğini inceliyor olacağız. Daha önceki Visual Studio sürümlerine baktığımızda kodlarımızı sadece belirli noktalardan kapatabiliyorduk. (Namespaceler, metot tanımları vs..). Örneğin sadece bir if bloğunu kapatmamız mümkün değildi. Ancak Visual Studio 2010 ile beraber artık bu da mümkün hale gelmiş durumda. İstediğimiz kod bloğunu görünmez duruma getirmek için kodu seçip sağ tıkla Outlining->Hide Selection tıklayarak kodu istediğimiz kısımdan görünmez yapabilmekteyiz.

 

Yada kısayol olarak Ctrl+M Ctrl+H kullanabilmekteyiz. Kodu yeniden eski konumuna getirmemiz için kod üzerine sağ tık Outlining->Stop Hiding Content yapmamız yeterli.

Görüşmek Üzere,

Categories:   Visual Studio 2010 Tips | Visual Studio 2010 Tips | Visual Studio 2010
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (0) | Yorumlar RSSRSS Yorum Takibi
Share

Visual Studio 2010 Tips #9 - Highlighted References Özelliği

Çarşamba, 10 Mart 2010 22:52 by ilkayilknur

Merhaba Arkadaşlar,

Bu yazımızda Visual Studio 2010 ile beraber gelen Highlighted References özelliğini inceleyeceğiz. Bu özellik ile bir dosya içerisinde bulunan bir değişkenin yada referansın kullanıldığı tüm yerleri çok kolay bir şekilde görebilmekteyiz. Kullanım olarak ise öncelikle dosya içerisinde kullanım yerlerini görmek istediğimiz değişken yada referansın üzerine tıklıyoruz ve biraz bekliyoruz. Daha sonra ise Visual Studio o nesne yada değişkenin dosya içerisinde kullanıldığı yerleri çerçeve içerisine alıyor ve böylece rahatlıkla kullanım yerlerini görebiliyoruz. Ayrıca Ctrl+Shift+Up yada Ctrl+Shift+Down tuşları ile bu kullanım örnekleri arasında dolaşabilmekteyiz.

Örneğin aşağıdaki örnekte metot içerisinde bulunan inc değişkenin kullanıldığı yerler çerçeve içerisine alınmıştır.

 

Görüşmek Üzere,

Categories:   Visual Studio 2010
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (0) | Yorumlar RSSRSS Yorum Takibi
Share

Silverlight Toolkit - Expander Kontrolü

Çarşamba, 10 Mart 2010 21:31 by ilkayilknur

Merhaba Arkadaşlar,

Bu yazımızda Silverlight Toolkit içerisinde bulunan Expander kontrolünün kullanımını inceleyeceğiz. Bazı durumlarda Silverlight içerisinde bir başlık altında gruplama yapmak istediğimiz durumlar olur. İşte tam da bu durumda Expander kontrolü bize yardımcı olmakta. Expander kontrolünü kullanmamız için öncelikli olarak bilmemiz gerekenler Header ve Content propertyleri. Header propertysi ile gruplamamızın başlığını belirleyebilimekteyiz. Content propertysi ise gruplama açıldıktan sonra görüntülenecek olan içeriğimizdir. Expander kontrolünü inceleme açısından grup üyelerinin isimlerinin listelendiği bir senaryo düşünelim ve aşağıdaki gibi bir XAML kodunu yazalım.

<my:Expander Height="71" Width="300" Header="Grup Adı"
 Content="İlkay İlknur&#xd;&#xa;Çağdaş Olgun&#xd;&#xa;Deniz Kurto"/>

Uygulamayı çalıştırdığımızda ise aşağıdaki gibi bir kontrolle karşılaşmaktayız. Kontrolün sol tarafındaki butona basarak içeriği görünür duruma getirmekteyiz.

Expander kontrolünün açılması default olarak aşağı doğrudur. Ancak ExpandDirection propertysine Down, Left, Right, Up değerlerini verebilmekteyiz. Örneğin içeriğin sağ tarafta gözükmesi için ExpandDirection propertysini Right olarak verirsek kontrolümüz aşağıdaki gibi olmaktadır.

 

Expander kontrolünün diğer propertyleri ise tüm Silverlight kontrollerinde bulunan klasik propertylerdir. Yine her türlü Binding ve Templating özellikleri Expander kontrolünde de bulunmaktadır.

Görüşmek Üzere, 

Categories:  
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (0) | Yorumlar RSSRSS Yorum Takibi
Share

Silverlight - Özelleştirilmiş DataGrid İçerisinden Bind Edilen Nesneye Erişim

Pazar, 7 Mart 2010 13:54 by ilkayilknur

Merhaba Arkadaşlar,

Bu yazımızda Silverlight kontrollerinden DataGrid'i özelleştirilmiş bir şekilde kullanırken içerisinde bulunan bir butona tıklandığında o butonun hangi satırda olduğunu nasıl algılayabiliriz bunu incelemeye çalışacağız. Örnek olarak ise yine bir önceki yazıda kullandığımız Ürün sınıfını kullanacağız.( Yoğun istek üzerine {#emotions_dlg.wink} ) Daha sonra DataGrid'i özelleştirmiş bir şekilde tasarlarken içerisine bir buton koyacağız ve bu butona tıklandığında o satırdaki ürünün toplam fiyatı messagebox kullanarak göstereceğiz.

Ürün sınıfımız

public class Urun
{
   public string urunAdi { getset; }
   public double fiyat { getset; }
   public int adet  { getset; }
}

DataGrid Tasarımı

DataGrid içerisine her satırda bulunmak üzere bir Buton ekledik ve bu butonun Click eventine Button_Click isimli tek bir EventHandler atadık. Biz tüm hesaplama işlemlerini bu Handler üzerinden yapıyor olacağız. İlk olarak sender parametresini kullanarak hangi butona tıklandığını elde edeceğiz. Daha sonra ise Buton'un DataContext'ini kullanarak o satıra hangi ürün nesnesi bind edilmiş bunu alacağız ve gerekli işlemleri yapacağız.

private void Button_Click(object sender, RoutedEventArgs e)

{

   Urun urun = ((Button)sender).DataContext as Urun;

   MessageBox.Show((urun.fiyat * urun.adet).ToString());

}

Bir iki örnek nesne yaratıp uygulamayı çalıştırırsak.

 

Gördüğümüz gibi butonun DataContext'ine o satıra bind edilen sınıf bind edilmiş.Wink 

Uygulamaya buradan indirebilirsiniz. SilverlightApplication19.rar (1.017,68 kb)

Görüşmek Üzere,

Categories:   Silverlight 3.0
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (0) | Yorumlar RSSRSS Yorum Takibi
Share

Silverlight Toolkit - DataForm İçerisindeki Kontrollere Erişim

Cumartesi, 6 Mart 2010 17:14 by ilkayilknur

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

Tags:  
Categories:  
Actions:   E-mail | del.icio.us | Permalink | Yorumlar (0) | Yorumlar RSSRSS Yorum Takibi
Share