ben

OMÜ , Bilgisayar Mühendisliği, 13'

29 Ocak 2013 Salı

Mvvm controller ve olaylar

TextBox

Textboxta Propert olarak bağlanılan Text özelliği vardır. Bağlantı şekli;

Text="{Binding Path=Teslimedenadi,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"

   Eğer textboxta tanımlı olay yoksa yada giriş ardından bu text değişecekse PropertyChanged eklenir eğer girilen değer sadece tek yönlüyse yani içeriği değişmeyecekse buna gerek yoktur. TextBox' dada olaylar tanımlanabilir. Bunlardan en güzeli barkod okutma sistemi yani değer girişinin ardından enter'a basma olayı bu kısmı buradaki yazıda anlattığımdan burda tekrar girmeyeceğim.

Label

   Label controlünün alabildiği peroperty özelliği context 'dir.Bu da aynı TextBoxda ki gibi çalısır.Tek fark labelin kullanıcı tarafından değiştirilemez olmasıdır. Genellikle sabit görünmesini istediğimiz yazılarda kullanırız ve bunun içinde herhangi bir olay tanımlanmasına gerek kalmaz 

ComboBox

   Combobox controlunun iki farklı property si mevcut bunlardan ilki itemSource diğeri SelectedItem. Item source combobox'ın listeleyeceği bilgileri tutar. Bunlar genellikle ObservableCollection türündedir.  Yani buna ait viewModelde aşağıdaki gibi tanımlanmalıdır.

private ObservableCollection<string> _sehirList; 
public ObservableCollection<string> SehirList
{    get { return _sehirList; }
    set
    {
    _sehirList =value;    NotifyPropertyChanged(m => m.SehirList);
    }
}

    SelectedItem ise  kullanıcının comboboxtan sectiği değeri alır ve bağlı olduğu propertyde de tanımlanır.
 
ItemsSource="{Binding Path=Sehirlist}"
SelectedItem="{Binding Path=seciliSehir, Mode=TwoWay}" Olay olarak ise SelectionChanged olayı kullanılır.
<i:Interaction.Triggers>     <i:EventTrigger EventName="SelectionChanged">
       <ei:CallMethodAction MethodName="SehirListele" TargetObject="{Binding}" />

     </i:EventTrigger>
</i:Interaction.Triggers>

 DataGrid 

Property olarak ıtemsource ve selectedItem bilgisini tutar. Bu property yine Observable Collection olarak tanımlanmalı ve listelenecek değer bir model türünde olmalıdır. Örnek bir Model; 
class ucret : ModelBase<ucret>     
{        
      private IProvider _provider;         
      private int _toplam_ucret;         
      public int Toplam_ucret         
      {                
         get return _toplam_ucret; }                
         set                
         {                       
           _toplam_ucret = value;                       
           NotifyPropertyChanged(m => m.Toplam_ucret);                
         }           
      }         
      private int _alinan_ucret;         
      public int Alinan_ucret         
      {                
         get { return _alinan_ucret; }                
         set                
         {                     
           _alinan_ucret = value;                     
           NotifyPropertyChanged(m => m.Alinan_ucret);                 
         }         
       }        
      private string _odeme_tarih;         
      public string Odeme_tarih         
      {             
         get { return _odeme_tarih; }             
         set            
         {                      
            _odeme_tarih = value;                       
             NotifyPropertyChanged(m => m.Odeme_tarih);                
          }         
      }                 
     public ucret(IProvider provider)         
     {             
        _provider = provider;         
      }          
     public ucret()         
     {}    
}
  
 Bir sınıf acarak yukarıdaki gibi datagridde gorunmesini istediğimiz verileri modelleyerek gride atabilirz. Ama bunun için Property' nin de şu şekilde olmalı;

private ObservableCollection<ucret> _ucretList;
public ObservableCollection<ucret> UcretList
{
    get { return _ucretList; }
    set
    { 
      _ucretList =value;
       NotifyPropertyChanged(m => m.UcretList;
     }   
}

Vew de ise bu property şu şekilde bağlanır;

 <DataGrid Grid.Row="1" ItemsSource="{Binding Path=UcretListesi}"AutoGenerateColumns="False" Margin="5,10,10,10" Name="dataGrid2" >
    <DataGrid.Columns>
       <DataGridTextColumn Header="Toplam Ücret" Binding="{Binding Path=Toplam_Ucret}"/>
       <DataGridTextColumn Header="Alınan Ucret"   Binding="{Binding Path=Alinan_Ucret}" />
    </DataGrid.Columns>
</DataGrid>

   Burada DatGridin İçine tekrar Column acmamızın nedeni modelin içerisinden istediklerimizin gridde görünmesini sağlamak. Ve bunun için AutoGenerateColumns özelliğinin false olması gereklidir. Columns ' ait pathlarda belirtilen adlandırmalar datagridin alacağı modelin içerisindeki property lerle aynı olmalı.

  Selected Item bilgisine verilecek Property ise aşağıdaki gibi olamlıdır.

  private ucret _seciliUcret;
  public ucret SeciliUcret
 {
      get { return _seciliUcret; }
      set
     {
        _SeciliUcret =value;
         NotifyPropertyChanged(m => m.SeciliUcret;
     }
}

SelectedItem="{Binding Path=SeciliUcret, Mode=TwoWay}; 


Eğer ki Datagrid de herbir satır seçildiğinde bir olay olmasını ıstersek olayı datagrid tagları içerisine  yazarsak son durum aşağıdaki gibi olur.

<i:Interaction.Triggers>  

    <i:EventTrigger EventName="SelectionChanged">       
        <ei:CallMethodAction MethodName="SeciliUcreteAitOlay" TargetObject="{Binding}" />     
   </i:EventTrigger>
</i:Interaction.Triggers> 
<DataGrid.Columns>
     <DataGridTextColumn Header="Set Barkodu " Binding="{Binding Path=Toplam_Ucret}"/>

     <DataGridTextColumn Header="Set Adı" Binding="{Binding Path=Alinan_Ucret}" />
</DataGrid.Columns>

Hiç yorum yok: