Makale Özeti

Örnek bir uygulama üzerinden LINQ'da join işleminden ve listbox'da resim ve text kullanımını anlatılmaktadır.

Makale

Herkese merhaba,

Bu makalemde LINQ'daki join işleminden ve mobil uygulamalarda sıklıkla kullandığımız listbox'larda resim ve text'in beraber kullanımını örnek bir uygulama ile anlatacağım. 

Uygulamamız bazı şehirleri ve bu şehirlere göre ebzı radyo istasyonlarının frekanslarını tutan bir uygulama olsun. Yani şehir listemden şehiri seçeceğim. Sonra seçtiğim bu şehire göre bana kayıtlı olan radyo istasyonlarının frekansları listelenecek. Radyoları listelerken ise ben radyo istasyonlarının logolarını ve isimlerini yazdırmak istiyorum. Zaman kaybetmeden uygulamamıza geçelim.

Microsoft Visual Studio 2011’i çalıştırıp File -> New -> Project -> Windows Phone Application adımlarını izleyerek projemizi oluşturuyoruz. MainPage.xaml dosyamızı aşağıdaki şekilde hazırlıyoruz. (XAML kodu aşağıdadır.)

<phone:PhoneApplicationPage 
    x:Class="FMRadyolar.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">
    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="FM Radio" Style="{StaticResource PhoneTextNormalStyle}"/>
        </StackPanel>
        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <ListBox Height="211" HorizontalAlignment="Left" Margin="0,60,0,0" Name="lst_sehir" VerticalAlignment="Top" Width="456" SelectionChanged="lst_sehir_SelectionChanged">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding SehirAdi}" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <TextBlock Height="51" HorizontalAlignment="Left" Margin="0,6,0,0" Name="textBlock1" Text="Şehirler:" VerticalAlignment="Top" FontSize="32" />
            <ListBox Height="306" HorizontalAlignment="Left" Margin="0,345,0,0" Name="lst_radio" VerticalAlignment="Top" Width="450" SelectionChanged="lst_radio_SelectionChanged">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal"  Height="140" Width="450" Margin="5" >
                            <Image Source="{Binding imgurl}" Width="150" Height="130" Stretch="None"/>
                            <TextBlock Text="{Binding radyoadi}" Margin="25,55,0,0"/>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate> 
            </ListBox>
            <TextBlock FontSize="32" Height="51" HorizontalAlignment="Left" Margin="0,293,0,0" Name="textBlock2" Text="İstasyonlar:" VerticalAlignment="Top" />
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>

Gördüğünüz gibi iki MainPage.xaml dosyamızda “lst_sehir” ve “lst_radio” olmak üzere iki adet listbox’ımız var.

Uygulamamızda kullanacağımız veritabanımızda 3 adet tablomuz vardır. Bunlardan ilki “Radiolar” isimli tablomuzdur. Bu tablomuz RadioId, RadioAdi ve RadioImgURL isimli sütunlardan oluşmaktadır. İkinci tablomuz ise “Sehirler” ismindedir. Bu tablomuzdaki alanlar ise SehirId ve SehirAdi şeklindedir. Üçüncü ve son tablomuz ise “RadioBilgisi” isminde olup SehirId, RadioId ve Frekans isimli alanlardan oluşmaktadır. Uygulamamızda veritabanımızın kullanımından bahsetmem gerekirse Sehirler tablomuzdan bilgileri alıp lst_sehir isimli listbox’ımızda şehirlerimizin isimlerini görüntüleyeceğiz. Kullanıcı bir şehri seçtiğinde ise RadioBilgisi isimli tablodan şehrimize ait kayıtları lst_radio isimli listbox’da görüntüleyeceğiz. Bu bilgileri verdikten sonra veritabanımızı oluşturacak kodları yazalım. Bunun için ilk olarak projemize “System.Data.Linq” referansımızı ekliyoruz ve build ediyoruz. Ardından projemize öncelikle “Radio.cs” isimli sınıfımızı ekliyoruz. İçerisine aşağıdaki kodlarımızı ekliyoruz.

 

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Data.Linq.Mapping;

namespace FMRadyolar
{
    [Table(Name = "Radiolar")]
    public class Radio
    {
        [Column(IsPrimaryKey = true, Name = "RadioId", CanBeNull = false, IsDbGenerated = true,
            DbType = "INT NOT NULL IDENTITY", AutoSync = AutoSync.OnInsert)]
        public int RadioID { get; set; }

        [Column(Name = "RadyoAdi")]
        public string RadioAdi { get; set; }

        [Column(Name = "RadyoImgURL")]
        public string RadioImgUrl { get; set; }
    }

    [Table(Name = "Sehirler")]
    public class Sehir
    {
        [Column(IsPrimaryKey = true, Name = "SehirId", CanBeNull = false, IsDbGenerated = true,
            DbType = "INT NOT NULL IDENTITY", AutoSync = AutoSync.OnInsert)]
        public int SehirID { get; set; }

        [Column(Name = "SehirAdi")]
        public string SehirAdi { get; set; }
    }

    [Table(Name = "RadioBilgisi")]
    public class Frekanss
    {
        [Column(IsPrimaryKey = true, Name = "SehirId", CanBeNull = false)]
        public int SehirID { get; set; }

        [Column(IsPrimaryKey = true, Name = "RadioId", CanBeNull = false)]
        public int RadioID { get; set; }

        [Column(Name = "Frekans", CanBeNull = false)]
        public double FrekansNo { get; set; }
    }
}

Ardından projemize “RadioDataContext.cs” isimli sınıfımızı ekliyoruz. Burada connection stringimizi yazıyoruz. RadioDataContext.cs içerisindeki kodlarımız aşağıdaki gibidir:

 

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Data.Linq;

namespace FMRadyolar
{
    public class RadioDataContext:DataContext
    {
        public const string ConnectionString = "isostore:/qdadios.sdf";

        public Table<Radio> Radiolar { get; set; }
        public Table<Sehir> Sehirler { get; set; }
        public Table<Frekanss> Frekanslar { get; set; }

        public RadioDataContext(string connectionString): base(connectionString)
        {
            this.Radiolar = this.GetTable<Radio>();
            this.Sehirler = this.GetTable<Sehir>();
            this.Frekanslar = this.GetTable<Frekanss>();
        }
    }
}

Bu işlemin ardından projemize “RadioDeposu.cs” isimli sınıfımızı ekliyoruz. Burada veritabanımızı oluşturup içerisine verilerimizi ekliyoruz. Kullandığımız kodlar aşağıdaki gibidir:

 

namespace FMRadyolar
{
    public class RadioDeposu
    {
        public static void Baslat()
        {
            RadioDataContext rd = new RadioDataContext(RadioDataContext.ConnectionString);
            if (rd.DatabaseExists() == false)
            {
                rd.CreateDatabase();
                //Yaptığın değişiklikleri veri kaynağına yansıtırsın.
                rd.SubmitChanges();
                VeriEkle();
            }
        }
        private static void VeriEkle()
        {
            RadioDataContext rd = new RadioDataContext(RadioDataContext.ConnectionString);
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Alem FM", RadioImgUrl = "Images/alemfm.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Best FM", RadioImgUrl ="Images/bestfm.jpg"  });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Burç FM", RadioImgUrl ="Images/burcfm.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Capital Radyo", RadioImgUrl ="Images/capitalradyo.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Dünya Radyo", RadioImgUrl = "Images/dunyaradyo.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Kral FM", RadioImgUrl ="Images/kralfm.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Meltem Radyo", RadioImgUrl ="Images/meltemradyo.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Metro FM", RadioImgUrl ="Images/metrofm.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Moral FM", RadioImgUrl ="Images/moralfm.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Number 1", RadioImgUrl = "Images/number1.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Polis Radyosu", RadioImgUrl ="Images/polisradyosu.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Power FM", RadioImgUrl ="Images/powerfm.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Power Türk FM", RadioImgUrl ="Images/powerturkfm.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Radyo 7", RadioImgUrl ="Images/radyo7.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Radyo 15", RadioImgUrl = "Images/radyoonbes.jpg"});
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Radyo D", RadioImgUrl ="Images/radyod.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Radyo Klas", RadioImgUrl ="Images/radyoklas.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Radyo Tatlıses", RadioImgUrl ="Images/radyotatlises.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Radyo Time", RadioImgUrl ="Images/radyotime.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "Radyo Viva", RadioImgUrl ="Images/radyoviva.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "TGRT FM", RadioImgUrl ="Images/tgrtfm.jpg" });
            rd.Radiolar.InsertOnSubmit(new Radio { RadioAdi = "TRT Radyo 1", RadioImgUrl = "Images/trtradyo1.jpg" });
            rd.SubmitChanges();

            RadioDataContext sh = new RadioDataContext(RadioDataContext.ConnectionString);
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "İstanbul" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Ankara" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "İzmir" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Adana" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Antalya" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Bursa" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Edirne" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Erzurum" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Eskişehir" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Gaziantep" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "İçel" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Kahramanmaraş" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Kayseri" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Kocaeli" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Konya" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Malatya" });
            sh.Sehirler.InsertOnSubmit(new Sehir { SehirAdi = "Trabzon" });
            sh.SubmitChanges();

            RadioDataContext fre = new RadioDataContext(RadioDataContext.ConnectionString);

            //İstanbul
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 1, FrekansNo = 89.2 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 2, FrekansNo = 98.4 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 3, FrekansNo = 88.8 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 4, FrekansNo = 99.4 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 5, FrekansNo = 93.5 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 6, FrekansNo = 92.0 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 7, FrekansNo = 97.8 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 8, FrekansNo = 97.2 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 9, FrekansNo = 105.0 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 10, FrekansNo = 102.5 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 11, FrekansNo = 94.1 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 12, FrekansNo = 100.0 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 13, FrekansNo = 99.8 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 14, FrekansNo = 104.6 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 15, FrekansNo = 101.3 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 16, FrekansNo = 104.0 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 17, FrekansNo = 98.6 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 18, FrekansNo = 97.6 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 19, FrekansNo = 91.2 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 20, FrekansNo = 90.1 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 21, FrekansNo = 93.1 });
            fre.Frekanslar.InsertOnSubmit(new Frekanss { SehirID = 1, RadioID = 22, FrekansNo = 95.6 });
            fre.SubmitChanges();
 

Şimdide son olarak “Rdd.cs” isimli sınıfımızı projemize ekliyoruz. İçerisindeki kodlar aşağıdaki gibidir.

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace FMRadyolar
{
    public class Rdd
    {
        public int sehirid { get; set; }
        public int radioid { get; set; }
        public double frekansnoo { get; set; }
        public string imgurl { get; set; }
        public string radyoadi { get; set; }
    }
}

Buraya kadar projemizde kullanacağımız veritabanımızı ve verilerimizi oluşturmuş olduk. Şimdi sıra geldi veritabanımızdan bir verinin LINQ ile alınması ve listbox’ların kullanımını.

Mainpage.xaml.cs dosyamızı açıyoruz. Hatırlarsanız makalemin başında öncelikle şehirlerimizi listeleyeceğimizi söylemiştim. Bunun için Mainpage.xaml.cs dosyamızın içerisine aşağıdaki kodlarımızı ekliyoruz.

 public int secsehirid;      
        ObservableCollection<Rdd> rdds = new ObservableCollection<Rdd>();
        ObservableCollection<Sehir> sehir = new ObservableCollection<Sehir>();
        
        public MainPage()
        {
            InitializeComponent();
            SehirListesiAl(); 
        }
        public void SehirListesiAl()
        {
            RadioDataContext sh = new RadioDataContext(RadioDataContext.ConnectionString);
            var sorgu = from u in sh.Sehirler orderby u.SehirAdi select new
            {
                Sehirid=u.SehirID,
                sehiradi=u.SehirAdi,
            };

            foreach (var t in sorgu)
            {
                sehir.Add(new Sehir() { SehirID = t.Sehirid, SehirAdi = t.sehiradi });
            }
            lst_sehir.ItemsSource=sehir;
        }       
 

ObservableCollection sınıfını kullanabilmemiz için “using System.Collections.ObjectModel” referansımızı eklememiz gerekiyor. Veritabanımıza bağlanmak için DataContext kullanıyoruz. Ardından sorgumuzu yazıyoruz. Burada Sehirid=u.SehirID ile sehiradi=u.SehirAdi satırlarına dikkat etmenizi istiyorum. Sehirid ve sehiradi yerine başka isimlerde kullanabilirsiniz. Bu isimleri sehir isimli ObservableCollection nesnemizde içerisindeki verilere ulaşmak için kullanıyoruz. Bilgilerimizi lst_sehir isimli listbox’a aktarmış olduk. Şehir seçimi kısmına geçecek olursak bunun için lst_sehir isimli listboxımızın SelectionChanged eventını kullanıyoruz.

 
namespace FMRadyolar
{
    public partial class MainPage : PhoneApplicationPage
    {
        public int secsehirid;      
        ObservableCollection<Rdd> rdds = new ObservableCollection<Rdd>();
        ObservableCollection<Sehir> sehir = new ObservableCollection<Sehir>();
        
        public MainPage()
        {
            InitializeComponent();
            SehirListesiAl(); 
        }
        public void SehirListesiAl()
        {
            RadioDataContext sh = new RadioDataContext(RadioDataContext.ConnectionString);
            var sorgu = from u in sh.Sehirler orderby u.SehirAdi select new
            {
                Sehirid=u.SehirID,
                sehiradi=u.SehirAdi,
            };

            foreach (var t in sorgu)
            {
                sehir.Add(new Sehir() { SehirID = t.Sehirid, SehirAdi = t.sehiradi });
            }
            lst_sehir.ItemsSource=sehir;
        }       
        private void lst_sehir_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            rdds.Clear();
            RadioDataContext radiogetr = new RadioDataContext(RadioDataContext.ConnectionString);
            secsehirid = sehir[lst_sehir.SelectedIndex].SehirID;
            var sorgu = from u in radiogetr.Frekanslar
                        join y in radiogetr.Radiolar
                        on u.RadioID equals y.RadioID
                        orderby y.RadioAdi
                        where u.SehirID == secsehirid
                        select new
                        {
                            SehirID = u.SehirID,
                            RadioID = u.RadioID,
                            frekans= u.FrekansNo,
                            RadyoIMG = y.RadioImgUrl,
                            RadyoAdi = y.RadioAdi,
                        };
            foreach (var t in sorgu)
            {
                rdds.Add(new Rdd() { sehirid = t.SehirID, radioid = t.RadioID, frekansnoo=t.frekans, radyoadi = t.RadyoAdi, imgurl = t.RadyoIMG });
            }

            lst_radio.ItemsSource = rdds;
        }
 

Burada integer tipinde secsehirid isimli bir değişken ile ikinci bir ObservableCollection tanımladık. Şehirlerimizin listelendiği listbox’dan seçilen ilimizin idsini secsehirid isimli değişkenimize aktarıyoruz ve yeni bir sorgu oluşturuyoruz. Bu sorgumuzda yapacağımız işlem şu: Seçilen ile ait radyo istasyonlarının frekanslarının listelenmesidir. Kodumuza göre  ifade etmem gerekirse secsehirid değişkeninde tutulan idye ait kayıtların RadioBilgisi ve Radiolar isimli tabloların join edilmiş halinden kayıtları almaktır. Bu iki tablonun ortak alanları RadioID isimli alanlarımızdır. Neden böyle bir join işlemine ihtiyaç duyduk derseniz biz radyo istasyonlarını listelerken onlara ait logoları da listelemek istiyoruz. Logoların tutulduğu adres bilgisini ise Radiolar isimli tabloda “RadyoImgURL” isimli alanda tutuyorduk.  

Sıra geldi “MainPage.xaml” sayfamızdaki listboxlar ile ilgili yaptığımız değişikliklerin anlatılmasına. İlk olarak lst_sehir isimli listboxmızı ele alalım.

Listboxların itemları ile ilgili değişiklik yapacaksak xaml tarafında bunu ifade etmemiz lazım. Bu işlem için öncelikle <Lisbox.ItemTemplate> </ Lisbox.ItemTemplate> bloklarını oluşturuyoruz. Ardından <DataTemplate> </DataTemplate> bloklarını oluşturuyoruz. İçerisine kullanacağımız bileşenleri ekliyoruz( TextBlock, Image vb. gibi). Burada dikkat edeceğimiz kısım ise TextBlock’lar için Text= “{ Binding SehirAdi }” kısmıdır. Burada sehir isimli ObservableCollection içerisindeki verilerden SehirAdi isimli alanının içerisindeki verileri bu listboxa bind ediyoruz. 

İkinci listbox için ise yukarıdaki adımları yaptıktan sonra bir stackpanel içerisine Image ve TextBlock ekliyoruz. Stackpanel eklememizin sebebi ise resim ile text’in yanyana yazmasını sağlamak içindir. Yine yukarıdaki gibi gerekli binding kısımları düzenliyoruz.

Umarım işinize yarar. Uygulamızın ekran görüntüleri aşağıdaki gibidir:

 

 

 

Uygulamayı FMRadyolar.rar  indirebilirsiniz.