Bölüm 18'in özeti. MVVM
Not
Bu kitap 2016 baharında yayımlanmıştır ve o zamandan beri güncellenmemiştir. Kitapta değerli kalan çok şey vardır, ancak bazı malzemeler eskidir ve bazı konular artık tamamen doğru veya eksiksiz değildir.
Bir uygulamanın mimarisini oluşturmanın en iyi yollarından biri, kullanıcı arabirimini bazen iş mantığı olarak adlandırılan temel koddan ayırmaktır. Çeşitli teknikler vardır, ancak XAML tabanlı ortamlar için uyarlanmış olan Model-View-ViewModel veya MVVM olarak bilinir.
MVVM ilişkileri
MVVM uygulamasının üç katmanı vardır:
- Model, bazen dosyalar veya web erişimleri aracılığıyla temel alınan veriler sağlar
- Görünüm, genellikle XAML'de uygulanan kullanıcı arabirimi veya sunu katmanıdır
- ViewModel, Modeli ve Görünümü birbirine bağlar
Model, ViewModel'i bilmez ve ViewModel de Görünüm'ü bilmez. Bu üç katman genellikle aşağıdaki mekanizmaları kullanarak birbirine bağlanır:
Daha küçük birçok programda (ve hatta daha büyük programlarda), genellikle Model yoktur veya işlevi ViewModel ile tümleştirilir.
ViewModels ve veri bağlama
Veri bağlamalarıyla etkileşime geçmek için ViewModel'in bir özelliği değiştiğinde ViewModel'e bildirimde bulunabilmelidir. ViewModel bunu, ad alanında System.ComponentModel
arabirimini uygulayarak INotifyPropertyChanged
yapar. Bu, yerine Xamarin.Forms.NET'in bir parçasıdır. (Genel Olarak ViewModel'ler platform bağımsızlığını korumaya çalışır.)
Arabirimi, INotifyPropertyChanged
değiştirilen özelliği gösteren adlı PropertyChanged
tek bir olay bildirir.
ViewModel saati
Book.Toolkit kitaplığındaXamarin.Forms, zamanlayıcıya göre değişen tür DateTime
özelliğini tanımlar.DateTimeViewModel
sınıfı, özellik her DateTime
değiştiğinde PropertyChanged
olayı uygular INotifyPropertyChanged
ve başlatır.
MvvmClock örneği bu ViewModel'in örneğini oluşturur ve güncelleştirilmiş tarih ve saat bilgilerini görüntülemek için ViewModel'e veri bağlamaları kullanır.
ViewModel'deki etkileşimli özellikler
Bir ViewModel'deki özellikler, SimpleMultiplier örneğinin SimpleMultiplierViewModel
bir parçası olan sınıfı tarafından gösterildiği gibi daha etkileşimli olabilir. Veri bağlamaları iki Slider
öğeden multiplicand ve çarpan değerleri sağlar ve ürünü ile Label
görüntüler. Ancak, XAML'de bu kullanıcı arabiriminde ViewModel veya arka planda kod dosyasında herhangi bir değişiklik olmadan kapsamlı değişiklikler yapabilirsiniz.
Renk GörünümüModeli
Book.Toolkit kitaplığındakiXamarin.Forms, RGB ve HSL renk modellerini tümleştirir.ColorViewModel
HslSliders örneğinde gösterilmiştir :
ViewModel'i Akışa Alma
ViewModels'teki kod, çağrı özelliği adını otomatik olarak alan özniteliği kullanılarak CallerMemberName
bir OnPropertyChanged
yöntem tanımlanarak kolaylaştırılabilir. Book.Toolkit kitaplığındakiXamarin.Forms sınıf bunu yapar ve ViewModels için bir temel sınıf sağlar.ViewModelBase
Komut arabirimi
MVVM veri bağlamalarıyla ve veri bağlamaları özelliklerle çalıştığından, bir veya Tapped
bir olayının işlenmesi Clicked
söz konusu olduğunda MVVM'nin Button
TapGestureRecognizer
eksik olduğu görülüyor. ViewModel'lerin bu tür olayları Xamarin.Forms işlemesine izin vermek için komut arabirimini destekler.
Komut arabirimi, içinde iki genel özellik ile kendini Button
bildirir:
Command
türüICommand
(ad alanındaSystem.Windows.Input
tanımlanır)CommandParameter
türüObject
Komut arabirimini desteklemek için, ViewModel öğesinin ICommand
özelliğine Command
bağlı olan türde bir özellik tanımlaması Button
gerekir. ICommand
Arabirimi iki yöntem ve bir olay bildirir:
Execute
Tür bağımsız değişkenine sahip bir yöntemobject
CanExecute
Döndüren türobject
bağımsız değişkenine sahip bir yöntembool
- Bir
CanExecuteChanged
olay
Dahili olarak, ViewModel türündeki ICommand
her özelliği arabirimi uygulayan bir sınıfın örneğine ICommand
ayarlar. Veri bağlaması aracılığıyla, Button
başlangıçta yöntemini çağırır CanExecute
ve yöntemi döndürürse false
kendisini devre dışı bırakır. Ayrıca olay için CanExecuteChanged
bir işleyici ayarlar ve olay her tetiklendiğinde çağırır CanExecute
. Button
etkinleştirilirse, öğesine her Button
tıklandığında yöntemini çağırırExecute
.
öncesi Xamarin.Formsolan bazı ViewModel'leriniz olabilir ve bunlar zaten komut arabirimini destekliyor olabilir. Yalnızca ile Xamarin.FormsXamarin.Forms kullanılması amaçlanan yeni ViewModel'ler için bir Command
sınıf ve arabirimini uygulayan ICommand
bir Command<T>
sınıf sağlar. Genel tür, ve CanExecute
yöntemleri için bağımsız değişkenin Execute
türüdür.
Basit yöntem yürütmeleri
PowersOfThree örneği, ViewModel'de komut arabiriminin nasıl kullanılacağını gösterir. sınıfı PowersViewModel
türündeki ICommand
iki özelliği tanımlar ve ayrıca en Command
basit oluşturucuya geçirdiği iki özel özelliği tanımlar. Program, bu ViewModel'den iki Button
öğe özelliklerine Command
veri bağlamaları içerir.
Öğeler Button
, kod değişikliği olmadan XAML'deki nesnelerle TapGestureRecognizer
kolayca değiştirilebilir.
Hesap makinesi, neredeyse
AddingMachine örneği hem ve Execute
CanExecute
yöntemlerini ICommand
kullanır. Book.Toolkit kitaplığında Xamarin.Formsbir AdderViewModel
sınıf kullanır. ViewModel türünde ICommand
altı özellik içerir. Bunlar oluşturucusundan Command
veCommand
oluşturucusundanCommand
veCommand<T>
oluşturucusundanCommand<T>
başlatılır. Ekleme makinesinin sayısal anahtarlarının tümü ile Command<T>
başlatılan özelliğe bağlıdır ve için bir string
bağımsız değişkendir Execute
ve CanExecute
belirli anahtarı tanımlar.
ViewModels ve uygulama yaşam döngüsü
AdderViewModel
AddingMachine örneğinde kullanılan, ve RestoreState
adlı SaveState
iki yöntemi de tanımlar. Bu yöntemler, uyku moduna geçtiğinde ve yeniden başlatıldığında uygulamadan çağrılır.