Herkese merhabalar,

Bu aralar bloğumu biraz boş bıraktığımın farkındayım.Son zamanlarda gerçekten yoğun bir tempo içindeydim.Her işin içinden bir iş daha çıkmaya başladıJHer neyse sonuna yazmayı başardım.Bu yazımda sizlere WFP için kendi DataSourceProvider larımızı nasıl oluşturabileceğimizden bahsetmek istiyorum.İşe ilk olarak bir sınıf yaratıp bu sınıfı DataSourceProvider sınıfından kalıtmak olacaktır.Şu an WPF bizlere iki adet DataSourceProvider sunmaktadır.Bunlar,

ObjectDataProvider:Projemizdeki belirli bir sınıfın herhangi bir metodunu çağırmamızı sağlar.Metod ismi ve parametreleri gibi özellikleri bulunmaktadır.

XmlDataProvider:Çeşitli XML kaynaklarından veri sağlamak için kullanılmaktadır.Aslında framework ile gelen bu iki sınıf gerçekten harika fakat kendi veri sağlayıcılarımızı nasıl yazabileceğimizi bilmeliyiz.Üstelik o kadar da çok zor bir olay değil.Hatta üç adımda bunu gerçekleştirebiliriz.

- DataSourceProvider sınıfından kalıtım almış bir sınıf oluşturmak

-BeginQuery metodunu ezmek

-Bazı noktalarda OnQueryFinished metodunu çağırmak

Bunun avantajlarından biri de  arkaplanda yükleyebilme özelliğidir.Bunu XAML  tarafında IsAsync property’sini ayarlayarak yapabilirsiniz.

class TextDataSource:DataSourceProvider   

{

   private bool isAsync = false;

   private string fileName = string.Empty; 

   public bool IsAsync

   {

     get { return isAsync; }

     set { isAsync = value; OnPropertyChanged(new PropertyChangedEventArgs("IsAsync"));}

   }                

   public string FileName

   {

     get { return fileName; }

     set{fileName = value;OnPropertyChanged(new PropertyChangedEventArgs("FileName"));}

   }

   public object ObjectInstance

   {

     get { return Data; }

     set{ OnQueryFinished(value, null, null, null);OnPropertyChanged(new PropertyChangedEventArgs("ObjectInstance"));}

   } 

   protected override void BeginQuery()

   {

      if (IsAsync)

       {

          ThreadPool.QueueUserWorkItem(RunQuery, null);

       }

      else

         RunQuery(null);

    }

    private void RunQuery(object state)

    {

       StringBuilder sb = new StringBuilder();

       base.BeginQuery();

       FileStream fs = new FileStream(FileName,FileMode.Open,FileAccess.Read);

       StreamReader rd = new StreamReader(fs,Encoding.Default);

       while(!rd.EndOfStream)

      {

        sb.Append(rd.ReadLine()+"\n");

      }

       ObjectInstance = sb;

    }

 }

  Gelelim XAML tarafında kontrolümüzü kullanmaya,

<Window.Resources>

<local:TextDataSource x:Key="myProvider" IsAsync="True" FileName="C:\Test.txt"/>
</Window.Resources>

<DockPanel>

<TextBlock Text="{Binding Mode=OneTime,Source={StaticResource myProvider}}" DockPanel.Dock="Top" HorizontalAlignment="Center" Height="30" />

</DockPanel>

Örnek uygulama:DataSourceProvider.rar (33,76 kb)

About the Author