Xamarin.Forms Command Kullanımı

Bu makalede Command’ın ne olduğundan ve MVVM mimarisi ile geliştirdiğimiz Xamarin.Forms uygulamamızda Command arayüzünü nasıl kullanacağımızdan bahsedeceğim.

Command nedir?

MVVM mimarisinin temelinde veri bağlama (data binding) işlemi vardır. Veri bağlama, kod’da yapılan bir değişikliği kullanıcı arayüzüne aktarmak için sık sık kullanılır. Bu makalenin konusu olan Command yapısı ise aslında bunun tersini yapmak istediğimizde kullanacağımız yapıdır. Yani kullanıcı arayüz ile etkileşim kurduğunda kod’daki bir şeyi değiştirme işlemidir.

Normalde UI etkileşimli bir metodu çağırmak için event tanımlıyorduk. Ancak bu işlemi MVVM ile yapmak ve View Model deki bir şeyi değiştirmek istiyorsak, hali hazırda Xamarin.Forms’un desteklediği Command arayüzünü kullanarak ViewModel’e method çağrısı yapabiliriz.

Xamarin.Forms kontrollerinden Command yapısını kullanabileceklerimiz şunlardır:

  • Button
  • MenuItem
  • ToolbarItem
  • SearchBar
  • TextCell
  • ImageCell
  • ListView
  • TapGestureRecognizer

SearchBar’da özel olarak SearchCommand, ListView’de RefreshCommand, Entry’de ReturnCommand tanımlıdır ve bunlar da ICommand tipindedir.

Yukarıda listelenmiş kontrollerden herhangi birinin event’i ile, biz Button’dan ilerleyelim, ViewModel arasında veri bağlama işlemini sağlayabilmek için kullanmamız gereken iki property vardır:

  • Command, System.Windows.Input tipinde
  • CommandParameter, Object tipinde

Command yapısını kullanırken yapmamız gerekenler:

  • Button’un, Command özelliği atanmalı
  • ViewModel’de Button’daki Command’ın karşılığı olan ICommand tipinde bir property tanımlanmalı

ICommand Arayüzü

ViewModel’de tanımladığımız property’nin tipi ICommand olacak demiştik. ICommand arayüzünün kaynak kodunu incelersek iki metod, bir event yer aldığını görürüz.

Kullanıcı Button’a tıkladığında, atanmış Command’ın ViewModel’deki karşılığında ICommand.Execute metodu çağrılır. Bu, Command yapısının en temel kullanılış şeklidir.

Veri, ilk olarak Button’un Command özelliğinde atanırsa ve bir şekilde değişirse, Button, ICommand.CanExecute metodunu çağırabilir. Bu method bool bir sonuç döner ve false dönerse, Button pasif, true ise aktif olur. Bu da o komutun geçersiz olduğunu ve kullanılamayacağını gösterir.

CanExecuteChanged event’i de View Model’e tanımlanır ve ne zaman bağlı olduğu komut tetiklense önce CanExecute’u çalıştırır. Dönen sonuca göre de kontrolü aktif veya pasif yapar.

NOT: Command yapısını kullanılıyorsa IsEnabled yerine yukarıdaki yaklaşım kullanılmalıdır.

Command ve Command<T>

ICommand arayüzü Xamarin.Forms’a değil System kütüphanesine aittir. Xamarin.Forms’daki Command ve Command<T> sınıfları bu arayüzü implement ederek bu metod ve event’e erişim sağlar. Command sınıfının 4 adet yapıcı metodu bulunur.

Command(Action)

Command(Action<Object>)

Command(Action, Func<Boolean>)

Command(Action<Object>, Func<Object,Boolean>)

Parametre olarak bir Action alır, bu da neyi execute edeceğini anlamasını sağlar.

CommandParameter Kullanımı

Tanımladığımız Command ile beraber bir parametre göndermek istiyorsak Command<T> sınıfını kullanarak bu parametrenin tipini tanımlayabiliriz. Bu durumda Execute ve CanExecute metodlarının parametreleri de bu tanımlanan tipte olur.

Demo Uygulama

Şimdi Command’ı basit bir şekilde kullandığımız bir demo yapalım. Demoda girilen sayının 5 katını alıp, girilen sayı 0’dan büyükse bir Label’da gösterelim. Bunun için öncelikle sayfamızı tanımlıyoruz:

Ve View Model’i tanımlıyoruz:

Burada Calculate, Button’a basınca çalışacak olan Command’ı, CanCalculate ise bu komutun çalışıp çalışamayacağını yani Button’un aktif olup olmayacağına karar verir. Bu durumda IsEnable özelliğine gerek kalmadığını da görüyoruz. Number değişkeni her değiştiğinde CanExecute çalışır ve verilen koşula göre button aktif veya pasif olur.

Demo uygulamanın linki.

Faydalı Kaynaklar:

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir