24 Mar 2009 Silverlight 3 Beta – SaveFileDialog Kullanımı Kategori: Silverlight Etiketler: Silverlight 3 BetaSilverlight 2 Yorum Merhaba arkadaşlar, bu makalemizde Silverlight 3 Beta ile birlikte gelen SaveFileDialog nesnesinin kullanımı inceleyeceğiz.Silverlight 3 Beta ile birlikte gelen SaveFileDialog ile Silverlight uygulamasındaki bir dosyayı istemci kullanıcının makinesine kaydetmemizi sağlar. Hatırlatmak da fayda var, Silverlight 2.0 ile birlikte de OpenFileDialog kontrolü Silverlight kontrol kütüphanesine eklenmişti. Bu kontrolle de istemcinin makinesindeki bir dosyayı Silverlight uygulaması içinde kullanabiliyoruz. Şöyle bir şey yapabiliriz artık, OpenFileDialog ile bir dosyayı alıp üzerinde değişiklik yapıp, SaveFileDialog kontrolü ile de kaydedebiliriz. SaveFileDialog kontrolünün bazı önemli özelliklerini inceleyecek olursak;Filter özelliği ile SaveFileDialog ile kaydedilecek dosyanın uzantısını yada uzantılarını bu özellikle belirleyebiliriFilterIndex özelliği ile filtreler içinde bulunan seçeneklerden hangisinin seçileceğini belirleriz. DefaultExt özelliği ile herhangi bir filter seçmezsek DefaultExt özelliği ile belirttiğimiz uzantıyı alır ShowDialog metodu ile SaveFileDialogu ekranda gösterebiliyoruz. Geriye Boolen bir değer döndürür. Silverlight uygulamasında kullanıcıların Text dosyalarını açıp bu dosyalar üzerinde değişiklik yapıp kaydetmesini sağlayacak bir uygulama geliştirelim. Böylece hem OpenFileDialog hemde SavaFileDialog nesnelerini incelemiş olacağız. Bunun için Silverlight projesi oluşturalım. Projemize aç, kaydet için iki buton ve dosyadaki içeriği görüntülemek içinde bir textbox ekleyelim. [XAML] <UserControl x:Class="SL3BetaSaveFileDialogKontrolu.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"><Canvas x:Name="LayoutRoot" Background="White"> <Button x:Name="btnAc" Content="Aç" Width="100" Height="30" Canvas.Top="10" Canvas.Left="10"></Button> <Button x:Name="btnKaydet" Content="Kaydet" Width="100" Height="30" Canvas.Left="120" Canvas.Top="10"></Button> <TextBox x:Name="txtIcerik" Text="İçerik" Width="380" Height="240" Canvas.Left="10" Canvas.Top="50"></TextBox></Canvas></UserControl> İlk olarak dosyayı OpenFileDialog nesnesini kullanarak açalım ve textbox kontrolün de gösterelim.[OpenFileDialog] void btnAc_Click(object sender, RoutedEventArgs e) { OpenFileDialog dosyaAc = new OpenFileDialog(); // OpenFileDialog nesnesi oluşturalım. dosyaAc.Multiselect = false; // Çoklu seçime izin vermeyelim. dosyaAc.Filter = "Text Dosyaları(*.txt)|*.txt"; // Açılacak olan dosyanın uzantısı if (dosyaAc.ShowDialog() == true) // Bir dosya seçilmezse yada iptal’e basılırsa hata vermemesi için kontrolümüzü yapalım { string contents = ""; StreamReader reader = new StreamReader(dosyaAc.File.OpenRead(), System.Text.Encoding.UTF8); // OpenFileDialog nesnesi ile açılan dosyayı StreamReader ile okuyalım. while(!reader.EndOfStream) // Okunan dosya sona geldimi { contents = reader.ReadToEnd();// Sonuna kadar oku } txtIcerik.Text = contents; // Okunan dosyanın içeriğini textbox’a ata. reader.Close(); // Okuyucuyla işimiz bitti kapatalım. }} Şimdide kullanıcının dosyayı SaveFileDialog nesnesi kullanarak kaydetmesini sağlayalım. [SaveFileDialog] void btnKaydet_Click(object sender, RoutedEventArgs e) { SaveFileDialog dosyaKaydet = new SaveFileDialog(); //SaveFileDialog nesnesi oluşturalım. dosyaKaydet.Filter = "Text Dosyası(txt)|*.txt"; // Kaydedilecek dosya sadece txt dosya olabilisin. if (dosyaKaydet.ShowDialog() == true) { StreamWriter writer = new StreamWriter(dosyaKaydet.OpenFile());//Seçilen dosyayı StreamWriter ile açalım… writer.Write(txtIcerik.Text);// Seçilen dosyaya içeriği atayalım. writer.Close(); // Yazıcıyı kapatmayı unutmayalım. }} Bir dosya açalım ve dosyayı kaydedelim. Eğer dosya yoksa direk de kaydedebiliriz Dosyayı kaydetmeye çalışalım. Masaüstüne kaydedelim, Şimdi Masaüstüne bakalım, Masaüstüne dosya kaydedilmiş, Dosyanın içine bakalım, Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;)Sem GÖKSU www.semgoksu.com | www.yazilimgunlugu.com sem.goksu@yazilimgunlugu.com Kaynaklarmsdn.comsilverlight.net
22 Mar 2009 Silverlight 3 Beta – BasedOn Style Kullanımı Kategori: Silverlight Etiketler: Silverlight 3 BetaSilverlight 1 Yorum Merhaba arkadaşlar, bu makalemizde Silverlight 3 Beta ile birlikte gelen BasedOn Styles özelliğini inceleyeceğiz.Silverlight 3 Beta ile birlikte gelen yeniliklerden biri de BasedOn Styles özelliğidir. BasedOn Style özelliği ile aynı türde kontrollerin benzer özellikleri taşıdığı durumlar da, ortak bir sitil oluşturulup, bu sitilin kontrollere uygulanabilmesini sağlar. Buraya kadar her şey normal aslında ve fark şuradan geliyor. Örneğin elimiz de iki tane Button var. Her iki butonunda FontSize özelliği 14px, arka plan renkleri farklı. Burada şunu yapabiliyoruz. Ortak özellikler için bir style(BasedOn Style), oluşturup, ayırt edici özellikler için her iki kontrole de ayrı ayrı style oluşturuyoruz. Oluşturduğumuz BasedOn style’ı her iki kontrol için oluşturduğumuz style’lara BasedOn özelliğini kullanarak uyguluyoruz. Böylece BasedOn Style'daki bütün özellikler butonlar için oluşturduğumuz sitiller tarafından devralınacak. Silverlight projesi oluşturalın ve konuyu daha detaylı olarak inceleyelim. Projemize 3 button ekleyelim ve butonlar için style'lar oluşturalım. Button'ların ortak özelliği olduğu için de ortak özellikleri uygulayacak bir style oluşturalım. [XAML] <UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SL3BetaBasedOnStyles.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"><Grid Background="White"><Grid.Resources><!— Ortak özellikler için Base Style, Bu style’ı uygulayan bütün style’lar bu style’ın tüm özelliklerini devralacak. TargetType özelliği ile bu sitilin hangi kontrole uygulanacağını belirtiyoruz. --><Style x:Key="BasedStyle" TargetType="Control"><!-- Setter ile bu sitili uygulayacak kontrol için özellik(property) ve o özelliğe atanacak değeri(Value) belirtiyoruz.--><Setter Property="FontSize" Value="14"></Setter><Setter Property="Width" Value="200"></Setter><Setter Property="Margin" Value="5"></Setter></Style><!-- 1. Button için Style, BasedOn özelliği ile belirtilen style’ın tüm özellikleri devralınır. BasedOn style daki tüm özellikleri burada uygulamışız gibi uygulanır--><Style x:Key="Button1Style" TargetType="Control" BasedOn="{StaticResource BasedStyle}"><Setter Property="Background" Value="Blue"></Setter><Setter Property="Foreground" Value="Red"></Setter></Style><!-- 2. Button için Style --><Style x:Key="Button2Style" TargetType="Control"BasedOn="{StaticResource BasedStyle}"><Setter Property="Background" Value="Red"></Setter><Setter Property="Foreground" Value="Navy"></Setter></Style> </Grid.Resources><StackPanel><!— BasedStyle uygulanan button --><Button Style="{StaticResource BasedStyle}" Content="Based Button"></Button><!— Button1Style’i uygulanan button --><Button Style="{StaticResource Button1Style}" Content="Button 1"></Button><!— Button2Style’i uygulanan button --><Button Style="{StaticResource Button2Style}" Content="Button 2"></Button></StackPanel></Grid></UserControl> Uygulamayı çalıştıralım ve sonucu görelim. Button için oluşturduğumuz based style’ı, hatta button’lar için oluşturduğumuz style’ları diğer style’lara uygulayabiliriz. Uygulamamıza bir TextBox ekleyelim ve onun için de bir style yazalım. [XAML] <!-- TextBox için Style oluşturduk ve Button2 için oluşturduğumuz Button2Style’ini uyguladık. TargetType olarak TextBox değerini atadık. Bu style artık sadece ve sadece TextBox kontrolüne uygulanabilecek. --><Style x:Key="TextBoxStyle" TargetType="TextBox" BasedOn="{StaticResource Button2Style}"><Setter Property="TextAlignment" Value="Center"></Setter><Setter Property="FontStyle" Value="Italic"></Setter><Setter Property="FontWeight" Value="Bold"></Setter> </Style><Button Style="{StaticResourceBasedStyle}"Content="Based Button"></Button><Button Style="{StaticResourceButton1Style}"Content="Button 1"></Button><Button Style="{StaticResourceButton2Style}"Content="Button 2"></Button><TextBox Style="{StaticResource TextBoxStyle}" Text="TextBox"></TextBox> Projemizi tekrar çalıştıralım, TextBox için oluşturduğumuz style’daki özellikler TextBox’a uygulanmış. Button2Style’nı BasedOn style yaptığımız için onun özellikler de uygulanmış. TextBox için oluşturduğumuz style’da TargetType özelliğini TextBox yaptığımız için artık bu style’ı sadece TextBox kontrolüne ve TextBox için oluşturacağımız diğer style’lara uygulayabiliriz. Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;) Sem GÖKSU www.semgoksu.com | www.yazilimgunlugu.com sem.goksu@yazilimgunlugu.com Kaynaklar msdn.com silverlight.net
21 Mar 2009 Silverlight 3 Beta – Silverlight Uygulamalarının Browser Dışına Alınması Kategori: Silverlight Etiketler: Silverlight 3 BetaSilverlight 0 Yorum Merhaba arkadaşlar, bu makalemizde Silverlight 3 Beta ile birlikte gelen bir diğer yenilik olan Silverlight uygulamalarının browser dışına alınmasına(out of browser) bakacağız.Silverlight 3 Beta ile çok güzel özelliklerin geldiğini söylemiştik. Fark yaratacak bir yenilikte Browser da çalışan Silverlight uygulamalarının offline ortama alınabilmesi. Evet yanlış duymadınız browser üzerinde çalışan bir Silverlight uygulamasının Masaüstüne ya da Start Menu’ye alıp browser ile hiçbir bağlantısı olmadan çalıştırabiliyoruz. Bu özelliği Silverlight uygulamamıza kazandırmak için yapmamız gereken şey çok basit. Silverlight uygulamasının bulunduğu projesinin Properties klasörü içinde yer alan AppManifest.xml dosyasını düzenlememiz yeterli olacaktır. [XML] <Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Deployment.Parts /><Deployment.ApplicationIdentity><ApplicationIdentity ShortName="KisayolAdi" Title="Silverlight uygulamasının Form Başlığı"><ApplicationIdentity.Blurb>Uygulama İle ilgili açıklama</ApplicationIdentity.Blurb><!—Uygulamada göstereceğimiz iconları yazıyoruz.--><ApplicationIdentity.Icons><Icon Size="16x16">1.png</Icon><Icon Size="32x32">2.png</Icon><Icon Size="64x64">3.png</Icon><Icon Size="128x128">4.png</Icon></ApplicationIdentity.Icons></ApplicationIdentity></Deployment.ApplicationIdentity></Deployment> Silverlight uygulaması üzerinde sağ tıklayarak “Intall KisayolAdi onto this computer” seçeneğini tıklayalım. Eğer bu işlemi kod ile yaptırmak istiyorsak ilgili yere App.Current.Detach(); yazmamız gerekiyor.Start Menuyü seçelim ve Start Menüyü açalım. Uygulamamız start menüye eklenmiş durumda. Şimdi Silverlight uygulamamızı çalıştıralım.Browser’dan bağımsız çalışan Silverlight uygulamamız hazır !Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;)Sem GÖKSU www.semgoksu.com | www.yazilimgunlugu.com sem.goksu@yazilimgunlugu.com Kaynaklarmsdn.comsilverlight.net
20 Mar 2009 Silverlight 3 Beta – Kontrollerin Birbirine Bağlanması Kategori: Silverlight Etiketler: Silverlight 3 BetaSilverlight 1 Yorum Merhaba arkadaşlar, bu makalemizde Silverlight 3 Beta ile birlikte gelen Silverlight UIElementlerin birbirine nasıl bağlandığını (UI Element to Element Binding) inceliyor olacağız. Silverlight 3 beta ile birlikte kontrolleri ve özelliklerini birbirine bağlayabiliyoruz. WPF içerisinde bu özellik olmasına rağmen Silverlight için yepyeni bir özelliktir. Bu özellik ile birlikte eventler arasında dolaşıp kod yazmadan kontrolleri ve özelliklerini birbirine bağlayabileceğiz. Örneğin, ComoBox’dan seçim yapıldığında seçilen değeri TextBlock kontrolünün Text özelliğine bağlayabiliriz. Geriye gidip daha önce bu işi nasıl yaptığımızı hatırlayalım.Yeni bir Silverlight projesi oluşturalım. Formumuza bir ComboBox ve bir tane de TextBlock kontrolü ekleyelim. [XAML]<UserControl x:Class="Silverlight3ElementToElement.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"><Canvas x:Name="LayoutRoot"Background="White" ><TextBlock x:Name="tbTakim" Width="150" Canvas.Left="15" Canvas.Top="10"></TextBlock><ComboBox x:Name="cmbTakimlar" Width="150" Canvas.Top="30" Canvas.Left="10"> </ComboBox></Canvas></UserControl> ComboBox’dan bir seçim yaptığımızda çalışan SelectionChanged isimli bir event var. Bu event de ComboBox’dan seçtiğimiz değeri TextBlock’un Text özelliğine atayabiliriz. İlk olarak UserControl için Loaded Event Listener’ini oluşturup ComboBox’a eleman ekleyelim. Daha sonra da atama işlemini yapacağomız SelectionChanged event listenerini oluşturalım.[C#]publicMainPage(){InitializeComponent();// Event Listenerları oluşturalım.this.Loaded += new RoutedEventHandler(MainPage_Loaded);cmbTakimlar.SelectionChanged += new SelectionChangedEventHandler(cmbTakimlar_SelectionChanged);}void MainPage_Loaded(object sender, RoutedEventArgs e){// Listbox’a eleman ekliyelimcmbTakimlar.Items.Add("Fenerbahçe");cmbTakimlar.Items.Add("Galatasaray");cmbTakimlar.Items.Add("Beşiktaş");cmbTakimlar.Items.Add("Trabzon Spor");} void cmbTakimlar_SelectionChanged(object sender, SelectionChangedEventArgs e){// Atama işlemini yapalım.tbTakim.Text = cmbTakimlar.SelectedItem.ToString(); } Eskiden bu şekilde kod yazarak kontrolleri ve özelliklerini birbirine bağlayabiliyorduk. Silverlight 3 Beta ile birlikte artık kontrolleri birbirine bağlamak çok daha kolay. [Kullanımı]<UIElement Text="{Binding BağlanacakÖzellik, ElementName=BağlanacakKontrol}"></UIElement > Şimdi yukarıda event listener ile yaptığımız bağlama işlemini Silverlight 3 Beta ile gelen yeni özellik ile yapalım. [XAML]<UserControlx:Class="Silverlight3ElementToElement.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"><Canvas x:Name="LayoutRoot" Background="White" >// TextBlock kontrolünün Text özelliği ile ComoBox kontrolünün SelectedItem özelliğini birbirine bağladık. ComboBox’ın SelectedItem özelliği ne ise TextBlock kontrolünün Text özelliği de o olacak.<TextBlock x:Name="tbTakim" Width="150" Canvas.Left="15" Canvas.Top="10" Text="{Binding SelectedItem,ElementName=cmbTakimlar}"></TextBlock><ComboBox x:Name="cmbTakimlar" Width="150"Canvas.Top="30" Canvas.Left="10"> </ComboBox></Canvas></UserControl> Hiç kod yazmadan kontrolleri birbirine bağladık :) Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;) Sem GÖKSU www.semgoksu.com | www.yazilimgunlugu.com sem.goksu@yazilimgunlugu.com Kaynaklar msdn.com silverlight.net
20 Mar 2009 Silverlight 3 Beta – DataForm Kontrolüne Genel Bakış Kategori: Silverlight Etiketler: Silverlight 3 BetaSilverlight 1 Yorum Merhaba arkadaşlar, bu makalemizde Silverlight 3 Beta ile birlikte gelen DataForm kontrolünü inceliyor olacağız.Herkesin merakla beklediği, Silverlight 3 Beta’nın duyurulmasıyla birlikte özellikle Data kontrollerinde bir çok yenilik ve yeni kontrol bizleri bekliyor. Bu kontrollerden en başarılısı bana göre DataForm kontrolü olmuş. DataForm kontrolü ile geliştiricinin vakit harcayacağı bir çok işi bizim yerimize düşünüp yapıyor. (Dizayn, validation vb gibi işler). Aynı zamanda istersek DataForm kontrolü istediğimiz gibi kişiselleştirebiliyoruz. DataForm kontrolü, ASP.NET data kontrolü olan DetailsView kontrolüne benzer bir kontroldür. DataForm ile Silverlight da hızlı bir şekilde formlar oluşturabiliyoruz. Bu form tek bir nesne için yada bir koleksiyon içinde olabilir. Örneğin, Ürünler arasında gezinebilir, bu ürünleri güncelleyip, silebilir ve hatta oluşturduğumuz form ile yeni bir ürün de ekleyebiliriz. Yeni bir Silverlight 3.0 projesi oluşturalım ve DataForm kontrolü ile ilk uygulamamızı yapalım. Projemiz de Ürünler ile ilgili işlemler yapacağımızı varsayalım. Bunun için ilk olarak Projemize Urun isimli bir Class ekleyelim [Urun.cs] public class Urun { public int UrunID { get; set; } public string UrunAdi { get; set; } public double Fiyat { get; set; } } Classımız hazır şimdi de Ürün’ü göstereceğimiz formu hazırlayalım. Bunun için projemize bir DataForm kontrolü ekleyelim. Visual Studio 2008 de Toolbox’dan XAML’a kontrolü direk sürükleyebiliriz. Yada XAML kodunu aşağıdaki gibi yazabiliriz. Bunu yapmadan önce projemizin referanslarına System.ComponentModel, System.ComponentModel.DataAnnotations ve System.Windows.Controls.Data.DataForm kütüphanelerini ekleyelim. [XAML]<UserControl xmlns:dc="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm"// DataForm Kontrolünün namespace ve assembly’six:Class="SilverlightHtmlRender.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400"Height="300"> <Grid x:Name="LayoutRoot" Background="White"> <dc:DataForm x:Name="Urun"></dc:DataForm> // DataForm Kontrolü</Grid></UserControl> Şimdi DataForm kontrolü için UserControl içinde bir Resource oluşturalım. Bu Resource DataForm üzerinde görüntülenecek olan Urun classı’nı içerecek [XAML] <UserControl xmlns:dc="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm" x:Class="SilverlightHtmlRender.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300" xmlns:template="clr-namespace:SilverlightDataForm"><UserControl.Resources> <template:Urun x:Key="urun" UrunID="1" UrunAdi="Laptop" Fiyat="100"></template:Urun></UserControl.Resources> // DataForm Kontrolü için resouce oluşturduk<Grid x:Name="LayoutRoot" Background="White"> <dc:DataForm x:Name="uyeler" CurrentItem="{StaticResource urun}"></dc:DataForm></Grid></UserControl>DataForm kontrolünün CurrentItem özelliği, Dataform üzerinde gösterilecek olan resource’u belirlememize yarar. Burada Resource içinde şuan için tek bir kayıt olduğu için sadece onu gösteriyor olacak. Gördüğünüz gibi hiç uğraşmadan Form aşağıdaki gibi oldu bile :) Form ilk açıldığında herhangi bir değişiklik yapamıyoruz. Sağdaki kaleme tıklarsak değişiklik yapmamıza izin veriyor. Bu işlemi Resource oluşturmadan dinamik olarak da yapabiliriz. Form_Loaded için event listener oluşturalım ve gerekli kodu yazalım. Sonuç yukarıdakiyle aynı olacaktır :)[MainPage.cs] publicMainPage(){ InitializeComponent(); this.Loaded += new RoutedEventHandler(MainPage_Loaded);}void MainPage_Loaded(object sender, RoutedEventArgs e){ // Diamik olarak CurrentItem’a Urun nesnesini atıyoruz. urunler.CurrentItem = new Urun() { UrunID = 1, UrunAdi = "Laptop", Fiyat=100 }; }Form’daki elemanların özelliklerini değiştirmek istersek, her şeyi yazdığımız Urun sınıfından yapabiliyoruz. Bunun için ilgili propertyler’e yada class’a attribute(nitelik) uygulamamız yeterli oluyor. Bu nitelikleri incelmek için Urun sınıfı üzerinde biraz oynayalım. [Urun.cs] publicclass Urun { [Display(Name = "Ürün Kodu", Order = 1, Description = "Ürün Kodunu gösteren Alan")] // Display: Property’nin görünüm özelliklerini belirleyen nitelik // Name: Etiket bilgisini değiştirmemizi sağlayan property // Order: Bu Property’nin Form üzerinde kaçıncı sırada gösterileceğini sağlayan property // Desctiption: Bu property ile ilgili bilgi verecek olan property [Bindable (true, BindingDirection.OneWay)] // Bindable: Bu property’nin form üzerinde gösterilip gösterilmemesini sağlayan nitelik. // BindingDirection: Bu property’nin form da hangi modda gösterileceğini belirtir. OneWay ise property readonly olur. public int UrunID { get; set; } [Display(Name = "Ürün Adı", Order = 2, Description = "Ürün Adını Gösteren Alan")] [Required(ErrorMessage = "Ürün Adı Girmeniz Zorunludur !")] // Required: Bu property’e veri girişinin zorunlu olmasını sağlayan nitelik // ErrorMessage: Eğer bu property’e veri girişi yapılmamışsa gösterilecek olan hata mesajı public string UrunAdi { get; set; } [Display(Name = "Fiyat", Order = 3, Description = "Ürün Fiyatını Gösteren Alan")] [Range(0,100, ErrorMessage="Ürün fıyatı 0-100 arasında olmalıdır")] // Range: Property’e girilen verinin aralığını kontrol eden nitelik // Minumum: Bu property’e girilebilecek en küçük değer // Maximum: Bu property’e girilebilecek en büyük değer // ErrorMessage: Eğer property’e veri girişi belirtilen aralık dışındaysa gösterilecek olan hata mesajı public double Fiyat { get; set; } } Şimdi projeyi tekrar çalıştıralım ve bakalım neler olmuş. İlk olarak etiketler bizim belirlediğimiz gibi olmuş J Ürün Adı alanına herhangi bir değer girmedim ve save butonuna bastım. Hata mesajı çıktı. Ürün kodunun sağında bir şey vardı üzerine gittim ve bana bir bilgi mesajı çıkardı :) Save butonu var orada peki o ne işe yarıyor? Oda formdaki yapılan değişikliklerin onaylanmasını sağlıyor. Akla hemen şu sorunun geldiği tahmin ediyorum. Save butonun’a basınca ben bir işlem yaptırmak istiyorsam ne olacak? Yada kaleme tıkladığımda bir işlem yapılmasını istiyorsam ne yapacağım? Bunun için yapmamız gereken şey IEditableObject Interface’ni ilgili class'a uygulamak olacaktır. Bizde bu Interface’i Urun Class’ına uygulayalım. [Urun.cs] public class Urun :IEditableObject // Interface’i uygulayalım { [Display(Name = "Ürün Kodu", Order = 1, Description = "Ürün Kodunu gösteren Alan")] [Bindable (true, BindingDirection.OneWay)] public int UrunID { get; set; } [Display(Name = "Ürün Adı", Order = 1, Description = "Ürün Adını Gösteren Alan")] [Required(ErrorMessage = "Ürün Kodu Girmeniz Zorunlu !")] public string UrunAdi { get; set; } [Display(Name = "Fiyat", Order = 1, Description = "Ürün Fiyatını Gösteren Alan")] [Range(0,100, ErrorMessage="Ürün fıyatı 0-100 arasında olmalıdır")] public double Fiyat { get; set; } #region IEditableObject Members public void BeginEdit() // Güncelle butonuna(Kaleme) basıldığında çalışacak metot { MessageBox.Show("Güncelleme modu açıldı"); } public void CancelEdit() // Güncelle işlemi iptal edildiğinde çalışacak metot { MessageBox.Show("Güncelleme iptal edildi"); } public void EndEdit() // Güncelle işlemi bittiğinde çalışacak metot { MessageBox.Show("Güncelleme yapıldı"); } #endregion} Şimdiye kadar hep tek nesne ile çalıştık. Şimdi bir ürün koleksiyonu oluşturalım ve onu DataForm kontrolünde kullanalım. [MainPage.cs] void MainPage_Loaded(object sender, RoutedEventArgs e){ // Ürün koleksiyonu oluşturalım. List<Urun> urunCollection = new List<Urun>(); urunCollection.Add(new Urun() { UrunID = 1, UrunAdi = "Masa", Fiyat= 100 }); urunCollection.Add(new Urun() { UrunID = 2, UrunAdi = "Kitap", Fiyat = 120 }); urunCollection.Add(new Urun() { UrunID = 3, UrunAdi = "Defter", Fiyat = 140 }); urunCollection.Add(new Urun() { UrunID = 4, UrunAdi = "Silgi", Fiyat = 120 }); urunCollection.Add(new Urun() { UrunID = 5, UrunAdi = "Cetvel", Fiyat = 110 }); urunler.ItemsSource = urunCollection; // Koleksiyonu ItemSource özelliğine bağladık.}Projemizi tekrar çalıştıralım, Navigasyon, Ekleme butonu, Silme Butonu da eklenmiş ;) Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;)Sem GÖKSU www.semgoksu.com | www.yazilimgunlugu.com sem.goksu@yazilimgunlugu.com Kaynaklarmsdn.comsilverlight.net